我正在进行大型Oracle数据库的批量迁移。第一步是将一大堆表重命名为稍后删除它们的准备(但我现在需要将数据保存在其中)。需要删除对它们的任何外键约束 - 它们根本不应连接到数据库的其余部分。如果我现在放弃它们我可以使用CASCADE CONSTRAINTS,但重命名只是改变了约束。
有没有办法可以放弃CASCADE CONSTRAINTS在不丢弃表本身的情况下放下的所有约束?
答案 0 :(得分:22)
您可以使用动态SQL和数据字典来执行此操作:
begin
for r in ( select table_name, constraint_name
from user_constraints
where constraint_type = 'R' )
loop
execute immediate 'alter table '|| r.table_name
||' drop constraint '|| r.constraint_name;
end loop;
end;
如果表由多个用户拥有,则需要从DBA_CONSTRAINTS驱动并在投影和执行的语句中包含OWNER。如果你想要触摸少于所有表格,我担心你需要在WHERE子句中指定列表,除非它们的名字有一些模式。
答案 1 :(得分:0)
您可以在不删除约束的情况下禁用/重新启用约束。看看this article。