1. 觸發器的本質
觸發器是一種特殊的預存程序,無法被顯式呼叫(不能用 EXEC 執行),而是在資料表發生 INSERT、UPDATE、DELETE 操作時,由資料庫引擎自動觸發執行。
2. 核心功能與特性
- 複雜完整性約束:超越
CHECK 約束限制,可參考其他資料表、執行複雜 T-SQL 邏輯。
- 資料一致性維護:當受保護資料異動時,自動執行關聯資料表操作(級聯修改/刪除/同步)。
- 交易整合性:觸發器與觸發它的 T-SQL 陳述式屬於同一個交易,具備 ACID 特性。若觸發器內發現非法操作(如關聯資料遺失),整個交易會回滾至觸發前狀態。
3. 觸發器 vs 約束
| 比較項目 | 約束 | 觸發器 |
| 效能 | 優(內核優化) | 較低(需解譯執行) |
| 複雜度 | 簡單邏輯(單表、單欄) | 複雜邏輯(跨表、多步驟) |
| 跨表參考 | 不支援 | 支援 |
| 偵測資料前後狀態 | 不支援 | 支援(INSERTED/DELETED 虛擬表) |
最佳實務: 能用約束解決的(主鍵、外鍵、非空、單欄 CHECK)優先用約束;需跨表驗證、複雜業務規則、審計日誌、衍生資料維護時使用觸發器。
4. 關鍵應用場景
- 級聯資料同步:主表異動自動更新從表彙總欄位。
- 複雜業務規則強制:如「訂單金額超過信用額度禁止新增」、「庫存不足自動產生採購單」。
- 稽核追蹤:記錄關鍵資料表的異動前後值、操作人、時間。
- 衍生資料維護:自動計算並更新冗餘欄位(如訂單明細金額彙總至主表)。
5. 設計原則
- 避免在觸發器中執行耗時操作(發送郵件、呼叫 Web Service、大量資料搬移),改用 Service Broker 或非同步機制。
- 善用
INSERTED 與 DELETED 虛擬表比較前後值,精準判斷異動類型與影響範圍。
- 嚴謹處理多列更新:
IF UPDATE(column_name) 判斷特定欄位是否被修改。
- 交易範圍最小化:觸發器內不額外開啟巢狀交易,依賴外層交易統一提交/回滾。