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

Oracle 觸發器開發入門:語法、類型與核心概念

     編輯:Oracle 教學

Oracle 觸發器開發入門:語法、類型與核心概念

觸發器是隱式執行的 PL/SQL 塊,針對特定數據庫事件(DML、DDL、系統事件)自動觸發,是實現複雜業務規則、審計追蹤、數據完整性輔助的關鍵手段。本文系統梳理觸發器語法結構、分類體系與核心伪列機制。

完整語法結構

CREATE [OR REPLACE] TRIGGER trigger_name
  {BEFORE | AFTER | INSTEAD OF}
  {INSERT | UPDATE [OF column] | DELETE}
  ON {table_name | view_name | DATABASE | SCHEMA}
  [REFERENCING [OLD AS old_alias] [NEW AS new_alias] [PARENT AS parent_alias]]
  [FOR EACH ROW]
  [FOLLOWS trigger_name]
  [DISABLE]
  [WHEN (condition)]
  [DECLARE
     -- 聲明區
     PRAGMA AUTONOMOUS_TRANSACTION; -- 自治事務
   ]
BEGIN
  -- 執行區
EXCEPTION
  -- 異常處理
END [trigger_name];

關鍵字句詳解

子句說明
BEFORE / AFTER觸發時機:操作前或操作後
INSTEAD OF替代觸發器,僅用於視圖,將 DML 轉發到底表
INSERT / UPDATE / DELETE觸發事件,可組合;UPDATE 可限定列(UPDATE OF col)
ON table/view/DATABASE/SCHEMA觸發對象:表、視圖、數據庫級、模式級
REFERENCING為 :OLD、:NEW、:PARENT 定義別名,提升可讀性
FOR EACH ROW行級觸發器(缺省為語句級)
FOLLOWS指定觸發順序(11g+),解決同類觸發器執行序列不確定問題
DISABLE創建時禁用,需 ALTER TRIGGER ... ENABLE 啟用
WHEN行級觸發器的額外過濾條件,減少不必要觸發
PRAGMA AUTONOMOUS_TRANSACTION聲明自治事務,允許觸發器內獨立提交/回滾

觸發器分類體系

維度類型特點
觸發時機BEFORE可修改 :NEW 值,常用於驗證、自動填充
AFTER不可修改 :NEW,常用於日志、級聯操作
觸發粒度語句級無 FOR EACH ROW,每條觸發語句僅觸發一次
行級FOR EACH ROW,每受影響行觸發一次,可訪問 :OLD/:NEW
觸發事件DML 觸發器INSERT/UPDATE/DELETE,最常用
DDL 觸發器CREATE/ALTER/DROP,審計結構變更
系統事件觸發器STARTUP/SHUTDOWN/LOGON/LOGOFF/SERVERERROR
特殊類型INSTEAD OF視圖專用,使不可更新視圖變為可更新

核心伪列::OLD 與 :NEW

  • :OLD.column:操作前的列值(INSERT 時為 NULL,DELETE 時為舊值,UPDATE 時為修改前值)。
  • :NEW.column:操作後的列值(INSERT 時為新值,DELETE 時為 NULL,UPDATE 時為修改後值)。
  • 僅行級觸發器可訪問;語句級觸發器不可用。
  • BEFORE 行級觸發器中可對 :NEW 賦值(如自動填充創建時間、序列號)。

自治事務應用場景

觸發器內需記錄操作日志,但主事務可能回滾,日志不應丟失:

CREATE OR REPLACE TRIGGER audit_trg
AFTER INSERT OR UPDATE OR DELETE ON sensitive_table
FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO audit_log(...) VALUES (...);
  COMMIT; -- 僅提交自治事務
END;
設計原則: 能用約束解決的不用觸發器;能用應用層解決的盡量不下沉到數據庫;觸發器邏輯必須極簡、極快,避免複雜查詢或遠程調用,否則嚴重拖慢 DML 性能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved