在 DB2 中創建觸發器,必須明確以下六大要素:
INSERT、DELETE、UPDATE(可指定列)BEFORE(操作前)或 AFTER(操作後)FOR EACH STATEMENT(語句級,默認)或 FOR EACH ROW(行級)OLD ROW:修改前的行值NEW ROW:修改後的行值OLD TABLE:修改前所有受影響行的只讀臨時表NEW TABLE:修改後所有受影響行的臨時表WHEN 子句,可包含謂詞、過渡變量、子查詢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
AFTER UPDATE OF ...:僅在指定列更新時觸發,減少不必要開銷。REFERENCING NEW AS N_ROW:為新行賦別名,便於 WHEN 與觸發體引用。FOR EACH ROW:行級觸發,針對每滿足條件的行執行一次。MODE DB2SQL:指定 DB2 SQL 模式(標準行為)。WHEN 子句:高效過濾,僅滿足條件才進入觸發體。BEGIN ATOMIC:確保觸發體內語句作為原子單元執行,要麼全成功要麼全回滾。VALUES (ISSUE_SHIP_REQUEST(...)):調用外部/內建函數處理業務邏輯(如發貨請求)。UPDATE 同表同行,將 ORDER_PENDING 置 'Y',防止重複觸發。OLD/NEW ROW/TABLE 訪問舊新值,避免再次查表。掌握以上模板,即可靈活應對審計、同步、衍生列維護等常見觸發器場景。