Сюрпризы Oracle – foreign keys and indexes

Oracle 10 не перестает удивлять. Я так и не понял как можно было загрузить дамп в котором в дочерней таблице были references на несуществующие записи в master таблице, при том что после загрузки данных он спокойно создал и соотвествующие constraints и индексы.

Deferrable constraints нигде нет. Да и не пользовали никогда. Вообщем – случилось и случилось.

Пришлось написать скрипт который ловит такие записи. Что с ними делать потом решать Вам. Все результаты сохраняются в таблице Exceptions.

 

DECLARE
 
  QuantityTemp NUMBER(23);
 
BEGIN
   BEGIN 
        EXECUTE IMMEDIATE 'DROP TABLE  EXCEPTIONS CASCADE CONSTRAINTS';
   EXCEPTION
        WHEN OTHERS THEN
          NULL;
   END;  
 
   BEGIN 
        EXECUTE IMMEDIATE 'create table exceptions(row_id rowid, owner varchar2(30), table_name varchar2(30),  constraint varchar2(30))';
   EXCEPTION
        WHEN OTHERS THEN
          NULL;
   END;  
 
   FOR X IN 
   (
      SELECT Constraint_name, TABLE_NAME FROM user_constraints
   )
   LOOP
      EXECUTE IMMEDIATE 'DELETE FROM Exceptions';
      BEGIN
        EXECUTE IMMEDIATE 'ALTER TABLE ' || x.TABLE_NAME ||  ' MODIFY CONSTRAINT ' || x.Constraint_name || ' VALIDATE EXCEPTIONS INTO EXCEPTIONS ';
      EXCEPTION
         WHEN OTHERS THEN
            NULL;
      END;  
 
      EXECUTE IMMEDIATE 'SELECT Count(*)  FROM Exceptions ' INTO quantityTemp;
      IF QuantityTemp <> 0 THEN
         dbms_output.put_line('Table ' || x.TABLE_NAME || ' CONSTRAINT: ' || x.Constraint_name || ' HAVE ' || QuantityTemp || ' problems. ');
      END IF;   
 
   END LOOP;
END;