2010-09-13 74 views
9

我正在對大型Oracle數據庫進行批量遷移。這個過程的第一步涉及重命名整個表格,以備日後刪除它們(但我現在需要將數據保留在其中)。任何外鍵約束都需要刪除 - 它們不應該連接到數據庫的其餘部分。如果我現在放棄它們,我可以使用CASCADE CONSTRAINTS,但重命名只是改變了約束條件。Oracle - 丟棄表的限制條件

有沒有一種方法可以放棄CASCADE CONSTRAINTS在不丟棄表本身的情況下放下的所有約束?

回答

18

您可以使用動態SQL和數據字典做聲明。如果你想觸摸少於所有的表,恐怕你需要在WHERE子句中指定列表,除非它們的名字有一些模式。

+0

看起來不錯。我已經添加了一些約束條件來反映我想修改哪些表,並隨之去掉。謝謝! – Submonoid 2010-09-13 15:31:04

0

您可以禁用/重新啓用約束而不會丟棄它們。看看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驅動和包括業主在投影和執行:

+0

是的,但這並不能真正幫助我。我可以去掉/禁用單個約束,但它是一個大型數據庫,我不想去查找引用我正在移動的表的所有約束。如果我使用'DROP TABLE foo CASCADE CONSTRAINTS',我希望能夠以與我相同的方式自動刪除所有約束。 – Submonoid 2010-09-13 14:21:16