之前我們介紹了 Oracle 11g 新特性中的 虛擬列 和 唯讀表,今天我們介紹另外一個新特性 —— 組合觸發器。
在以前版本的 Oracle 中,你可通過 FOLLOWS 關鍵字來控制觸發器執行的順序,例如:
01 |
CREATE OR REPLACE TRIGGER XXX_TRG |
04 |
REFERENCING NEW AS NEW OLD AS OLD |
Oracle 11g 支援名為組合觸發器的新特性,其作用跟 FOLLOWS 差不多,只是方式不同。
觸發器定時
在瞭解組合觸發器之前,我們先寫一個簡單的定時觸發器。
定時觸發器是觸發器將要執行的時間,例如 BEFORE STATEMENT, AFTER STATEMENT, BEFORE EACH ROW, 和 AFTER EACH ROW
可以在一個組合觸發器做所有的觸發動作。
組合觸發器指南
a- 組合觸發器合并了所有的定時觸發器
b- 組合觸發器僅限執行 DML 操作,不支援 DDL 和系統操作
c- 你只可在行級代碼塊中使用 :OLD 和 :NEW 變數標識符 (BEFORE EACH ROW, AFTER EACH ROW)
d- 不支援 PRAGMA_AUTONOMOUS_TRANSACTION
e- 你可使用 WHEN 語句來提升觸發器效能,但組合觸發器不支援
f- 所有的定時觸發器共用一個聲明部分中的變數,直到事務結束。
g- 允許在組合觸發器中重複執行某定時觸發器
h- INSERTING, UPDATING 和 DELETING 謂詞在組合觸發器中仍然有效
i- 解決變異表錯誤 Resolve mutating table error (ORA-04091)
組合觸發器文法:
01 |
CREATE OR REPLACE TRIGGER XXX_TRG |
02 |
FOR INSERT OR UPDATE OR DELETE ON XXX_TABLE_NAME |
06 |
--DECLARATION SECTION FOR ALL TRIGGER TIMING USED |
注意 BEFORE STATEMENT, AFTER STATEMENT, BEFORE EACH ROW 和 AFTER EACH ROW 是可選部分,你可根據需要使用。
INSTEAD OF ROW 只用於資料庫檢視。
如果你查看數字字典視圖 USER_TRIGGERS 你會發現一些新的列 (BEFORE_STATEMENT, BEFORE_ROW, AFTER_ROW, AFTER_STATEMENT, INSTEAD_OF_ROW) ,這些列是跟組合觸發器相關的。
結論
組合觸發器帶來的好處:
1- 在一個地方實現事務(?)
2- 所有觸發器可共用聲明段
3- 維護單元
4- 解決變異表錯誤 (ORA-04091)