需捕獲核心表 TM_USERG(用戶組)的增刪改操作,寫入暫存表 TM_USERG_TEMP,每日透過 Web Service 同步至下游系統,同步成功後清空暫存表。
CREATE TRIGGER LIBING.TG_USERG AFTER INSERT ON LIBING.TM_USERG
REFERENCING NEW AS NROW
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
DECLARE @groupId INTEGER; DECLARE @name VARCHAR(30); ... -- 變數宣告
SET @groupId = NROW.GROUP_ID; SET @name = NROW.name; ... -- 賦值
INSERT INTO TM_USERG_TEMP(GROUP_ID, NAME, DESCN, DDLSQL, ISPRIMARY,
UPDATE_TIME, CREATE_TIME, CREATE_BY, UPDATE_BY, GROUP_TYPE,
ADMIN_TYPE, APP_ID, ACTION)
VALUES (@groupId, @name, @descn, @ddlsql, @isprimary,
@updateTime, @createTime, @createBy, @updateBy, @groupType,
@adminType, @appId, 'INSERT');
END
CREATE TRIGGER TG_USERG_UPDATE AFTER UPDATE ON TM_USERG
REFERENCING NEW AS NROW
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
-- 變數宣告賦值同上
-- 邏輯:優先處理同組同動作的去重
IF EXISTS(SELECT 1 FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId AND ACTION='UPDATE') THEN
UPDATE TM_USERG_TEMP SET ... ACTION='UPDATE' WHERE GROUP_ID=@groupId AND ACTION='UPDATE';
ELSEIF EXISTS(SELECT 1 FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId AND ACTION='INSERT') THEN
UPDATE TM_USERG_TEMP SET ... ACTION='INSERT' WHERE GROUP_ID=@groupId AND ACTION='INSERT';
ELSE
INSERT INTO TM_USERG_TEMP(...) VALUES (...,'UPDATE');
END IF;
END
設計亮點:同一事務內多次 UPDATE 只保留最新;INSERT 後緊接 UPDATE 視為同一 INSERT 動作,避免下游重複處理。
CREATE TRIGGER TG_USERG_DELETE AFTER DELETE ON TM_USERG
REFERENCING OLD AS OROW
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
-- 變數從 OROW 賦值
IF NOT EXISTS(SELECT 1 FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId) THEN
INSERT ... ACTION='DELETE'; -- 純刪除
ELSEIF EXISTS(SELECT 1 FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId AND ACTION='INSERT') THEN
DELETE FROM TM_USERG_TEMP WHERE GROUP_ID=@groupId AND ACTION='INSERT'; -- INSERT+DELETE 抵消
ELSE
UPDATE TM_USERG_TEMP SET ACTION='DELETE' WHERE GROUP_ID=@groupId; -- UPDATE+DELETE 合併為 DELETE
END IF;
END
狀態機邏輯:
| 暫存表現狀 | 來 DELETE | 結果動作 |
|---|---|---|
| 無記錄 | → | INSERT DELETE |
| INSERT | → | 刪除該 INSERT 記錄(抵消) |
| UPDATE | → | UPDATE 該記錄為 DELETE |
REFERENCING NEW/OLD AS:標準 SQL 條款,取得新/舊行欄位FOR EACH ROW MODE DB2SQL:行級觸發,DB2 SQL 語法模式BEGIN ATOMIC:原子性區塊,隱含事務邊界@ 前綴(DB2 SQL PL 風格)EXISTS 子查詢配合條件更新/刪除,實現應用層難以做到的「同事務去重」TM_USERG_TEMP 記錄是否符合狀態機預期ACTION 分派下游邏輯TRUNCATE TABLE TM_USERG_TEMP IMMEDIATE(或 DELETE)清空OPERATION_TIME TIMESTAMP DEFAULT CURRENT TIMESTAMP 記錄觸發時間CDC (Change Data Capture) 或 Q Replication 降低觸發器開銷此模式適用於「中低頻異構同步、需業務語義去重、無 CDC 授權」的典型場景。