我想了几天来禁用所有表的约束,插入数据并启用约束。它的工作原理,但我做了一些测试,当我插入一个不尊重外键的行时,启用约束时没有错误信息。我只能看到这个约束没有被验证。启用oracle约束的问题
这是禁用
begin
BEGIN
FOR rec IN (SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type = 'R' OR constraint_type = 'P')
LOOP
BEGIN
EXECUTE IMMEDIATE 'alter table '||rec.table_name||' disable constraint '||rec.constraint_name;
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line('ERROR: alter table '||rec.table_name||' DISABLE constraint '||rec.constraint_name||';');
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE('CONSTRAINTS DISABLED');
END;
BEGIN
FOR rec IN (SELECT trigger_name FROM user_triggers WHERE TRIGGER_NAME NOT LIKE 'BIN$%')
LOOP
EXECUTE IMMEDIATE 'alter trigger '||rec.trigger_name||' disable';
END LOOP;
END;
DBMS_OUTPUT.PUT_LINE('TRIGGERS DISABLED');
end;
/
代码这是代码,以使
begin
BEGIN
FOR rec IN (SELECT constraint_name, table_name FROM user_constraints where status = 'DISABLED' and constraint_type = 'R' OR constraint_type = 'P')
LOOP
BEGIN
EXECUTE IMMEDIATE 'alter table '||rec.table_name||' enable constraint '||rec.constraint_name;
dbms_output.put_line('alter table '||rec.table_name||' enable constraint '||rec.constraint_name);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('ERROR: alter table '||rec.table_name||' enable constraint '||rec.constraint_name||' ;');
END;
END LOOP;
END;
DBMS_OUTPUT.PUT_LINE('CONSTRAINTS ENABLED');
BEGIN
FOR rec IN (SELECT trigger_name FROM user_triggers WHERE TRIGGER_NAME NOT LIKE 'BIN$%')
LOOP
EXECUTE IMMEDIATE 'alter trigger '||rec.trigger_name||' enable';
END LOOP;
END;
DBMS_OUTPUT.PUT_LINE('TRIGGERS ENABLED');
END;
我不知道如何检查所有约束在年底做了回退,如果它不没有工作。
如果最后的数据必须遵守这些约束条件,为什么要禁用约束? – GolezTrol 2011-06-16 14:44:25
因为我用数据加载了大量的xml文件,并且我没有把它们插入到正确的顺序中,所以需要很长时间。 – 2011-06-16 14:52:40