我正在进行大型Oracle数据库的批量迁移.其第一步涉及将整个表的重命名作为稍后删除它们的准备(但是现在我需要保留数据).对它们的任何外键限制都需要删除 – 它们不应该连接到数据库的其余部分.如果我现在放弃它,我可以CASCADE约束,但重命名只是改变约束.
有没有办法可以删除CASCADE CONSTRAINTS的所有约束,而不会丢弃表本身?
解决方法
您可以使用动态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 loop;
如果表由多个用户拥有,则需要从DBA_CONSTRAINTS驱动,并在投影和执行语句中包含OWNER.如果你想触摸少于所有的表,我恐怕你需要在WHERE子句中指定列表,除非他们的名字有一些模式.