我正在对大型 Oracle 数据库进行一些批量迁移。第一步涉及重命名整个表负载,以准备稍后删除它们(但我现在需要将数据保留在其中)。需要删除对它们的任何外键约束——它们根本不应该连接到数据库的其余部分。如果我现在删除它们,我可以级联约束,但重命名只会改变约束。
有没有一种方法可以删除 CASCADE CONSTRAINTS 会删除的所有约束而不删除表本身?
我正在对大型 Oracle 数据库进行一些批量迁移。第一步涉及重命名整个表负载,以准备稍后删除它们(但我现在需要将数据保留在其中)。需要删除对它们的任何外键约束——它们根本不应该连接到数据库的其余部分。如果我现在删除它们,我可以级联约束,但重命名只会改变约束。
有没有一种方法可以删除 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 子句中指定列表,除非它们的名称有某种模式。
您可以禁用/重新启用约束而不删除它们。看看这篇文章。