2013-05-31 4 views
3

У меня есть ссылочное ограничение, которое не будет включено, даже если ссылочные значения действительно находятся в ссылочной таблице. Я внимательно изучил правописание в скрипте ограничения и в обеих таблицах.Oracle 11g: Ограничение ограничения

Когда я пытаюсь включить ограничение, возвращается ошибка «родительский ключ не найден». Я физически сравнивал данные, и необходимые значения действительно находятся в таблице, на которую ссылаются.

Обозначенный столбец задан как первичный ключ и включен.

Связанный процесс касается загрузки/передачи данных из другой схемы/базы данных через dblink.

В исходных таблицах для передачи данных существует аналогичное ограничение, которое действительно включено.

Невозможно опубликовать данные из-за чувствительности к данным, просто надеялся, что я смогу получить некоторые идеи о дальнейших проверках.

Любые идеи или предложения, оцененные.

Код для ограничения:

ALTER TABLE SR2.LOG ADD (
    CONSTRAINT FF1 
    FOREIGN KEY (NOTCH_ID) 
    REFERENCES SR2.NOTCH (ID) 
    DISABLE NOVALIDATE); 
+0

ли пользователи продолжают вставлять данные на любой из родительских или дочерних таблиц в то время как вы проверяете на FK? Это делается в производственной базе данных? –

+0

Исходная таблица - это производство, но ссылочные значения можно увидеть в таблице ссылок. –

+0

Возможно, причиной может быть порядок, в котором пользовательский процесс вставляет данные. Такие вещи, как вставка на детскую таблицу. Только идея. Вы попробовали предложение EXCEPTIONS? –

ответ

5

Существует Оракул встроенное решение для этого. Вы можете использовать предложение EXCEPTIONS в ALTER TABLE:

-- parent table 
    create table t1 (col1 number primary key); 

    insert into t1 values (1); 
    insert into t1 values (2); 
    insert into t1 values (3); 
    commit; 

    -- child table 
    create table t2 (col1 number); 

    insert into t2 values (1); 
    insert into t2 values (2); 
    insert into t2 values (3); 
    insert into t2 values (4); -- bad data 
    commit; 

    -- You create a table for the exceptions 
    create table excepts (row_id rowid, 
         owner varchar2(30), 
         table_name varchar2(30), 
         constraint varchar2(30)); 

    -- you still get error 
    alter table t2 add constraint f2 foreign key (col1) references t1 
    exceptions into excepts ; 

    -- but bad data will be here 
    -- please notice its 'ROW_ID' from the second table 
    select t2.* 
    from t2, 
     excepts 
    where t2.rowid = excepts.row_id; 
+0

Вы все еще можете использовать его в инструкции ENABLE VALIDATE: alter table t2 включить проверку соответствия f2 исключения в исключения; –

+0

Спасибо, Фелипе. –

+0

+1 Всегда есть чему поучиться. Есть ли способ предотвратить ошибку во время 'alter table'? Вы знаете RDBMS, которые поддерживают аналогичный синтаксис? – Beryllium