我正在對大型Oracle數據庫進行批量遷移。這個過程的第一步涉及重命名整個表格,以備日後刪除它們(但我現在需要將數據保留在其中)。任何外鍵約束都需要刪除 - 它們不應該連接到數據庫的其餘部分。如果我現在放棄它們,我可以使用CASCADE CONSTRAINTS,但重命名只是改變了約束條件。Oracle - 丟棄表的限制條件
有沒有一種方法可以放棄CASCADE CONSTRAINTS在不丟棄表本身的情況下放下的所有約束?
我正在對大型Oracle數據庫進行批量遷移。這個過程的第一步涉及重命名整個表格,以備日後刪除它們(但我現在需要將數據保留在其中)。任何外鍵約束都需要刪除 - 它們不應該連接到數據庫的其餘部分。如果我現在放棄它們,我可以使用CASCADE CONSTRAINTS,但重命名只是改變了約束條件。Oracle - 丟棄表的限制條件
有沒有一種方法可以放棄CASCADE CONSTRAINTS在不丟棄表本身的情況下放下的所有約束?
您可以使用動態SQL和數據字典做聲明。如果你想觸摸少於所有的表,恐怕你需要在WHERE子句中指定列表,除非它們的名字有一些模式。
您可以禁用/重新啓用約束而不會丟棄它們。看看this article。
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驅動和包括業主在投影和執行:
是的,但這並不能真正幫助我。我可以去掉/禁用單個約束,但它是一個大型數據庫,我不想去查找引用我正在移動的表的所有約束。如果我使用'DROP TABLE foo CASCADE CONSTRAINTS',我希望能夠以與我相同的方式自動刪除所有約束。 – Submonoid 2010-09-13 14:21:16
看起來不錯。我已經添加了一些約束條件來反映我想修改哪些表,並隨之去掉。謝謝! – Submonoid 2010-09-13 15:31:04