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

DB2 觸發器創建全解析:語法詳解與實戰範例

     編輯:DB2 教學

觸發器核心組成元素

在 DB2 中創建觸發器,必須明確以下六大要素:

  • 觸發器名稱: 唯一標識
  • 觸發事件: INSERT、DELETE、UPDATE(可指定列)
  • 激活時間: BEFORE(操作前)或 AFTER(操作後)
  • 粒度: FOR EACH STATEMENT(語句級,默認)或 FOR EACH ROW(行級)
  • 過渡變量/表:
    • OLD ROW:修改前的行值
    • NEW ROW:修改後的行值
    • OLD TABLE:修改前所有受影響行的只讀臨時表
    • NEW TABLE:修改後所有受影響行的臨時表
  • 觸發條件: WHEN 子句,可包含謂詞、過渡變量、子查詢
  • 觸發體: 一條或多條 SQL 語句,包裹在 BEGIN ATOMIC ... END 中

實戰範例:庫存低於閾值自動發貨請求

場景:PARTS 表含 ON_HAND(現庫)、MAX_STOCKED(最大庫存)、ORDER_PENDING(訂單掛起標誌)。當現庫低於最大庫存 10% 且無掛起訂單時,自動呼叫發貨程序並標記掛起。

CREATE TRIGGER REORDER
AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS
REFERENCING NEW AS N_ROW
FOR EACH ROW MODE DB2SQL
WHEN (N_ROW.ON_HAND < 0.10 * N_ROW.MAX_STOCKED
      AND N_ROW.ORDER_PENDING = 'N')
BEGIN ATOMIC
  VALUES (ISSUE_SHIP_REQUEST(N_ROW.MAX_STOCKED - N_ROW.ON_HAND,
                             N_ROW.PARTNO));
  UPDATE PARTS
     SET ORDER_PENDING = 'Y'
   WHERE PARTNO = N_ROW.PARTNO;
END

關鍵點解讀

  1. AFTER UPDATE OF ...:僅在指定列更新時觸發,減少不必要開銷。
  2. REFERENCING NEW AS N_ROW:為新行賦別名,便於 WHEN 與觸發體引用。
  3. FOR EACH ROW:行級觸發,針對每滿足條件的行執行一次。
  4. MODE DB2SQL:指定 DB2 SQL 模式(標準行為)。
  5. WHEN 子句:高效過濾,僅滿足條件才進入觸發體。
  6. BEGIN ATOMIC:確保觸發體內語句作為原子單元執行,要麼全成功要麼全回滾。
  7. VALUES (ISSUE_SHIP_REQUEST(...)):調用外部/內建函數處理業務邏輯(如發貨請求)。
  8. 隨後 UPDATE 同表同行,將 ORDER_PENDING 置 'Y',防止重複觸發。

初學者建議

  • 先理解 行級 vs 語句級、BEFORE vs AFTER 的語義差異。
  • 善用 OLD/NEW ROW/TABLE 訪問舊新值,避免再次查表。
  • 觸發體保持精簡,複雜邏輯封裝為存儲過程/函數調用。
  • 充分測試邊界條件(NULL、並發更新、遞歸觸發)。

掌握以上模板,即可靈活應對審計、同步、衍生列維護等常見觸發器場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved