| 類型 | 觸發時機 | 執行頻率 | 典型用途 |
|---|---|---|---|
| 語句級 | BEFORE/AFTER | 每條 DML 語句一次 | 審計日志、安全檢查、統計維護 |
| 行級 | BEFORE/AFTER | 每受影響行一次 | 自動填充派生列、複雜業務規則、跨表同步 |
| INSTEAD OF | 替代 DML | 每行一次 | 視圖不可更新時重定向操作 |
| 系統事件 | 啟動/關閉/錯誤 | 事件發生時 | 自動啟動作業、記錄實例狀態 |
| 用戶事件 | 登錄/登出/DDL | 事件發生時 | 審計用戶行為、動態權限控制 |
CREATE OR REPLACE TRIGGER tri_test
AFTER INSERT OR UPDATE OR DELETE ON test
BEGIN
IF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('插入');
ELSIF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('修改');
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('刪除');
END IF;
END;
特點:無 :NEW/:OLD 伪記錄,適合記錄「發生了什麼操作」而非「具體數據變化」。
CREATE TABLE test (sid NUMBER, sname VARCHAR2(20));
CREATE SEQUENCE seq_test;
CREATE OR REPLACE TRIGGER tri_test
BEFORE INSERT OR UPDATE OF sid ON test
FOR EACH ROW
BEGIN
IF INSERTING THEN
SELECT seq_test.NEXTVAL INTO :NEW.sid FROM dual;
ELSE
RAISE_APPLICATION_ERROR(-20020, '不允許更新 ID 值!');
END IF;
END;
關鍵點:
FOR EACH ROW 聲明行級;:NEW.sid 賦值生效於插入;RAISE_APPLICATION_ERROR 中斷非法更新。| 場景 | 推薦類型 | 理由 |
|---|---|---|
| 記錄操作審計(誰、何時、什麼表、什麼操作) | 語句級 | 開銷小、無需逐行上下文 |
| 自動填充創建時間/修改時間/操作人 | 行級 | 需訪問 :NEW 每行 |
| 複雜跨表業務邏輯(如庫存扣減、賬戶轉賬) | 行級 | 需逐行協調事務 |
| 防止周末/節假日修改核心表 | 語句級 | 一次判斷覆蓋整條語句 |