觸發器可在資料表發生 INSERT/UPDATE/DELETE 時自動執行預定義邏輯,將業務規則封裝於資料庫層,確保所有應用程式一致遵守。本文以銀行透支保護為例,示範使用 DB2 Control Center 建立 BEFORE UPDATE 觸發器的完整流程。
客戶擁有支票帳戶與儲蓄帳戶,當支票帳戶提款導致餘額為負,自動從儲蓄帳戶轉入差額(前提是儲蓄餘額足夠)。資料表 ACCTTABLE 結構:
| 欄位 | 型別 | 說明 |
|---|---|---|
| SSN | VARCHAR(11) PK | 社會安全號 |
| LastName / FirstName | VARCHAR(30) | 姓名 |
| SavingBalance | DECIMAL(7,2) | 儲蓄餘額 |
| CheckingBalance | DECIMAL(7,2) | 支票餘額 |
CREATE DATABASE bnkdb;
CONNECT TO bnkdb USER db2admin USING db2admin;
CREATE TABLE accttable (
ssn VARCHAR(30) NOT NULL PRIMARY KEY,
lastname VARCHAR(30) NOT NULL,
firstname VARCHAR(30) NOT NULL,
savingbalance DECIMAL(7,2) NOT NULL,
checkingbalance DECIMAL(7,2) NOT NULL
);
INSERT INTO accttable VALUES ('111-11-1111','Bhogal','Kulvir',1500.00,1000);
INSERT INTO accttable VALUES ('222-22-2222','Guy','Someother',2000.00,4000);
bnkdb,右鍵 Triggers → Create。DB2ADMIN,觸發器名 OVERDRAFT,關聯表 ACCTTABLE。BEFORE;Triggering Event:UPDATE OF CHECKINGBALANCE。OLDROW;New Row 相關名:NEWROW。FOR EACH ROW(BEFORE 僅支援行級)。在 Triggered Action 文字區輸入:
DECLARE overage DECIMAL(7,2);
SET overage = (NEWROW.CHECKINGBALANCE * -1);
IF overage > OLDROW.SAVINGBALANCE THEN
SIGNAL SQLSTATE '70001' ('Overdraft Protection Unsuccessful');
ELSE
SET NEWROW.SAVINGBALANCE = OLDROW.SAVINGBALANCE - overage,
NEWROW.CHECKINGBALANCE = 0;
END IF;
邏輯解析:
overage 為支票帳戶透支金額(負值轉正)。點選 Close 完成建立。執行測試:
UPDATE accttable SET checkingbalance = -500 WHERE ssn = '111-11-1111';
SELECT * FROM accttable WHERE ssn = '111-11-1111';
-- 結果:checkingbalance = 0.00, savingbalance = 1000.00 (1500 - 500)
INSTEAD OF 觸發器(DB2 UDB 8.1+ 支援)。透過 Control Center 視覺化建立觸發器,配合 SQL PL 靈活表達業務邏輯,即可將透支保護等規則下沉至資料庫層,達成資料完整性與應用解耦的雙重目標。