我想創建一個在更新表時執行的觸發器。關於觸發器故障回滾的Oracle數據庫
特別是關於表的更新我想通過觸發更新另一個表,但如果觸發失敗(參考完整性 - 實體完整性),我不想再執行更新。
有關如何執行此操作的任何建議?
使用觸發器或通過存儲過程進行關鍵字操作會更好嗎?
感謝
我想創建一個在更新表時執行的觸發器。關於觸發器故障回滾的Oracle數據庫
特別是關於表的更新我想通過觸發更新另一個表,但如果觸發失敗(參考完整性 - 實體完整性),我不想再執行更新。
有關如何執行此操作的任何建議?
使用觸發器或通過存儲過程進行關鍵字操作會更好嗎?
感謝
觸發器中的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>
如果觸發失敗,將引發一個異常(除非你明確告訴它不要),在這種情況下,你必須在客戶端回滾。它通過觸發器或SP完成並不重要(儘管在邏輯SP中保留邏輯事務通常是一個好主意,而不是在觸發器之間傳播)。