資料庫觸發器是針對特定資料操作(INSERT/UPDATE/DELETE)自動執行的 PL/SQL 區塊。依執行時機分為 BEFORE(操作前)與 AFTER(操作後);依執行粒度分為 Statement-level(每次操作執行一次)與 Row-level(每影響一列執行一次,需指定 FOR EACH ROW)。
CREATE [OR REPLACE] TRIGGER 觸發器名稱
{BEFORE | AFTER} {INSERT | UPDATE | DELETE [OF 欄位] ...}
ON 表名稱
[FOR EACH ROW]
[WHEN (條件)]
DECLARE
-- 變數宣告
BEGIN
-- PL/SQL 程式碼
-- Row-level 可用 :NEW 與 :OLD 伪記錄
END;
/
| 子句 | 說明 |
|---|---|
| 觸發器名稱 | 識別用,觸發器自動執行不需呼叫 |
| BEFORE | 資料操作前執行,常用於驗證、修改 :NEW 值 |
| AFTER | 資料操作後執行,常用於稽核、觸發後續動作 |
| INSERT/UPDATE/DELETE | 觸發事件,可組合(如 BEFORE INSERT OR UPDATE) |
| FOR EACH ROW | 列級觸發器,無此子句為陳述式級 |
| WHEN | 額外條件過濾,僅滿足條件時觸發 |
CREATE OR REPLACE TRIGGER auth_secure
BEFORE INSERT OR UPDATE OR DELETE ON auths
BEGIN
IF TO_CHAR(SYSDATE, 'DY', 'NLS_DATE_LANGUAGE=AMERICAN') = 'SUN' THEN
RAISE_APPLICATION_ERROR(-20600, '禁止週末修改 AUTH 表');
END IF;
END;
/
解析:
TO_CHAR(SYSDATE,'DY') 判斷星期,建議明確指定 NLS 語言避免環境差異RAISE_APPLICATION_ERROR 拋出自訂錯誤,回滾當前操作:NEW.columnSYS_CONTEXT('USERENV','CLIENT_INFO') 實現細粒度存取控制_system_trigger_level 限制深度DBMS_OUTPUT 或寫入除錯表進行除錯USER_TRIGGERS、USER_TRIGGER_COLS 管理觸發器