我正在进行一项大型Oracle数据库的批量迁移工作。其中第一步涉及将大量表格重命名,作为稍后删除它们的准备工作(但我需要保留它们现在包含的数据)。这些表格上的任何外键约束都需要被删除 - 它们不应该与数据库的其他部分连接。如果现在要删除它们,可以使用CASCADE CONSTRAINTS,但重命名只会修改这些约束。
有没有办法在不删除表格本身的情况下删除所有CASCADE CONSTRAINTS会删除的约束?
我正在进行一项大型Oracle数据库的批量迁移工作。其中第一步涉及将大量表格重命名,作为稍后删除它们的准备工作(但我需要保留它们现在包含的数据)。这些表格上的任何外键约束都需要被删除 - 它们不应该与数据库的其他部分连接。如果现在要删除它们,可以使用CASCADE CONSTRAINTS,但重命名只会修改这些约束。
有没有办法在不删除表格本身的情况下删除所有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;
如果这些表被多个用户拥有,你需要从 DBA_CONSTRAINTS 表中获取数据,并在查询语句的投影以及执行语句中包含 OWNER。如果你只想操作其中的一部分表,除非表名有某种模式,否则你需要在 WHERE 子句中指定列表。
您可以在不删除它们的情况下禁用/重新启用约束。请查看本文。