首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 觸發器全面指南:類型、語法、時機與實戰範例

     編輯:Oracle 資料庫基礎

觸發器核心概念

資料庫觸發器是針對特定資料操作(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;
/

解析:

  • 陳述式級觸發器(無 FOR EACH ROW),表操作前執行一次
  • 使用 TO_CHAR(SYSDATE,'DY') 判斷星期,建議明確指定 NLS 語言避免環境差異
  • RAISE_APPLICATION_ERROR 拋出自訂錯誤,回滾當前操作

進階應用場景

  • 資料驗證與轉換:BEFORE ROW 觸發器修改 :NEW.column
  • 稽核軌跡:AFTER ROW 記錄變更前後值至稽核表
  • 衍生欄位維護:自動計算總價、更新時間戳記
  • 跨表同步:AFTER 觸發器更新摘要表、快照表
  • 安全性控制:結合 SYS_CONTEXT('USERENV','CLIENT_INFO') 實現細粒度存取控制

效能與除錯提醒

  • 避免觸發器中執行耗時邏輯,影響 DML 效能
  • 小心遞迴觸發(觸發器觸發另一觸發器),設定 _system_trigger_level 限制深度
  • 使用 DBMS_OUTPUT 或寫入除錯表進行除錯
  • 查詢 USER_TRIGGERS、USER_TRIGGER_COLS 管理觸發器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved