2010-04-24 50 views
2

我想創建一個在更新表時執行的觸發器。關於觸發器故障回滾的Oracle數據庫

特別是關於表的更新我想通過觸發更新另一個表,但如果觸發失敗(參考完整性 - 實體完整性),我不想再執行更新。

有關如何執行此操作的任何建議?

使用觸發器或通過存儲過程進行關鍵字操作會更好嗎?

感謝

回答

3

觸發器中的DML是與觸發DML相同的動作的一部分。兩者都必須成功或失敗。如果觸發器引發未處理的異常,則整個語句將回滾。

這是T23上的觸發器,它將行復制到T42中。

SQL> create or replace trigger t23_trg 
    2  before insert or update on t23 for each row 
    3 begin 
    4  insert into t42 values (:new.id, :new.col1); 
    5 end; 
    6/

Trigger created. 

SQL> 

成功inserrt到T23 ...

SQL> insert into t23 values (1, 'ABC') 
    2/

1 row created. 

SQL> select * from t42 
    2/

     ID COL 
---------- --- 
     1 ABC 

SQL> 

但是這一次會失敗,因爲在T42.ID.唯一的約束正如你所看到的觸發語句也回滾了...

SQL> insert into t23 values (1, 'XYZ') 
    2/
insert into t23 values (1, 'XYZ') 
      * 
ERROR at line 1: 
ORA-00001: unique constraint (APC.T24_PK) violated 
ORA-06512: at "APC.T23_TRG", line 2 
ORA-04088: error during execution of trigger 'APC.T23_TRG' 


SQL> select * from t42 
    2/

     ID COL 
---------- --- 
     1 ABC 

SQL> select * from t23 
    2/

     ID COL 
---------- --- 
     1 ABC 

SQL> 
0

如果觸發失敗,將引發一個異常(除非你明確告訴它不要),在這種情況下,你必須在客戶端回滾。它通過觸發器或SP完成並不重要(儘管在邏輯SP中保留邏輯事務通常是一個好主意,而不是在觸發器之間傳播)。