2011-04-01 55 views
3

在Postgresql中,如果我做ALTER TABLE mytable DISBLE TRIGGERS ALL,則關於此表的所有觸發器和約束都將暫停。如何禁用所有涉及Oracle中的表的觸發器?

尤其是,從其他表到mytable的外鍵被掛起,我可以從mytable中刪除沒有問題。我有破壞數據庫一致性的風險,但我知道我在做什麼,並且我必須擁有超級用戶權限。

如何在Oracle中執行相同的操作?我認爲Oracle中的ALTER TABLE mytable DISBLE ALL TRIGGERS會暫停屬於mytable的所有觸發器和約束,但不包括那些涉及mytable但屬於其他表(尤其是外鍵)的觸發器和約束。

我是對的嗎?如何在Oracle中實現與Postgresql相同的結果?

回答

5

的語法確實在Oracle中禁用觸發器:

SQL> select trigger_name, status from user_triggers 
    2 where table_name='TEST' 
    3/

TRIGGER_NAME     STATUS 
------------------------------ -------- 
TEST_TRIGGER     ENABLED 

SQL> ALTER TABLE test DISABLE ALL TRIGGERS 
    2/

Table altered. 

SQL> select trigger_name, status from user_triggers 
    2 where table_name='TEST' 
    3/

TRIGGER_NAME     STATUS 
------------------------------ -------- 
TEST_TRIGGER     DISABLED 

SQL> 

但是它不會做的外鍵,或任何其他約束東西。這是因爲Oracle不使用觸發器來執行這些事情。好吧,在封面的約束和用戶定義的觸發器可能共享某些低級別的內核代碼。但在我們說的層面上,他們是兩碼事。

如果要禁用表上恐怕你需要使用像這樣的外鍵:

SQL> select constraint_name, status from user_constraints 
    2 where table_name = 'EMP' 
    3 and constraint_type = 'R' 
    4/

CONSTRAINT_NAME    STATUS 
------------------------------ -------- 
FK_DEPTNO      ENABLED 


SQL> begin 
    2  for r in (select constraint_name, status from user_constraints 
    3     where table_name = 'EMP' 
    4     and constraint_type = 'R') 
    5  loop 
    6   execute immediate 'alter table emp disable constraint '||r.constraint_name; 
    7  end loop; 
    8* end; 
    9/

PL/SQL procedure successfully completed. 

SQL> select constraint_name, status from user_constraints 
    2 where table_name = 'EMP' 
    3 and constraint_type = 'R' 
    4/

CONSTRAINT_NAME    STATUS 
------------------------------ -------- 
FK_DEPTNO      DISABLED 

SQL> 

這是諸如此類的事情,你可能會想要包裝一個用戶定義的函數,它將TABLE_NAME作爲參數。您還需要一個類似的功能來重新啓用約束。

+0

事實上,我一直有點太快來驗證答案......這將禁用屬於mytable的約束,而不是與mytable相關的約束。 Postgresql中的所有禁用觸發器的功能是禁用指向mytable的外鍵... – alci 2011-04-01 18:43:55

+1

好的,在這裏禁用外鍵的相關sql指向mytable:'select'alter table'|| a.owner ||'。 「|| a.table_name || '禁用約束'|| a.constraint_name ||';' 從ALL_CONSTRAINTS一個,ALL_CONSTRAINTS b 其中a.constraint_type = 'R' 和a.r_constraint_name = b.constraint_name 和a.r_owner = b.owner 和b.table_name = 'MYTABLE';' – alci 2011-04-01 19:05:16

相關問題