首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 觸發器基礎:語法結構、六大功能與創建實例(一)

     編輯:Oracle 資料庫相關知識

一、觸發器 vs 存儲過程

維度觸發器存儲過程
調用方式事件自動觸發显式 CALL/EXECUTE
參數傳遞無(通過 :NEW/:OLD 上下文)IN/OUT/IN OUT 參數
事務控制隸屬觸發語句事務可獨立 COMMIT/ROLLBACK(自治事務除外)
返回值無函數可返回值

二、六大核心功能

  1. 允許/限制表修改(如業務時間窗口控制);
  2. 自動生成派生列(主鍵、時間戳、操作人);
  3. 強制數據一致性(跨表檢查、級聯更新);
  4. 提供審計與日志記錄(誰、何時、改了什麼);
  5. 防止無效事務(業務規則攔截);
  6. 啟用複雜業務邏輯(封裝於數據層)。

三、語法結構

CREATE [OR REPLACE] TRIGGER 觸發器名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE [OF 列名]} ON 表名
[FOR EACH ROW]
[WHEN (條件)]
DECLARE
  -- 變量聲明(行級可選)
BEGIN
  -- PL/SQL 塊
END;

四、關鍵子句解析

  • BEFORE:語句/行執行前,可修改 :NEW 值,常用於驗證、賦值;
  • AFTER:語句/行執行後,:NEW 已寫入,常用於審計、後續動作;
  • FOR EACH ROW:行級,無則為語句級;
  • WHEN:行級條件過濾,減少不必要觸發開銷。

五、創建實例:禁止周末修改表

CREATE TRIGGER auth_secure
BEFORE INSERT OR UPDATE OR DELETE ON auths
BEGIN
  IF TO_CHAR(SYSDATE, 'DY') IN ('SAT','SUN') THEN
    RAISE_APPLICATION_ERROR(-20600, '不能在周末修改表 auths');
  END IF;
END;

說明:語句級、BEFORE、攔截三種 DML,業務時間窗口控制經典模式。

六、新手常見誤區

  1. 以為觸發器可以 COMMIT/ROLLBACK —— 不能(除非 PRAGMA AUTONOMOUS_TRANSACTION);
  2. 語句級觸發器中引用 :NEW/:OLD —— 編譯報錯;
  3. 行級觸發器中執行 SELECT ... FROM 同表 —— ORA-04091 變異表錯誤;
  4. 觸發器名稱以為會被調用 —— 只是字典對象名,永不直接調用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved