觸發器是綁定在表/視圖上的特殊存儲過程,由 DML 事件(INSERT/UPDATE/DELETE)自動觸發,用於實現複雜參考完整性、審計追蹤、級聯業務邏輯、跨庫同步等約束無法覆蓋的場景。本文系統梳理兩大類型、執行機制、級聯風險與效能優化要點。
| 特性 | AFTER (FOR) 觸發器 | INSTEAD OF 觸發器 |
|---|---|---|
| 觸發時機 | 動作成功執行後(含約束檢查) | 替代原動作,原動作不執行 |
| 定義對象 | 僅表 | 表與視圖 |
| 同事件多觸發器 | 支援多個,可用 sp_settriggerorder 指定首/尾 | 同事件僅允許一個 |
| 典型用途 | 審計、級聯更新、異步通知 | 視圖可更新化、攔截並轉發、自定義邏輯替換 |
| 虛擬表 | inserted、deleted(內存駐留) | 同樣可用 |
inserted:INSERT/UPDATE 的新值;DELETE 時為空。deleted:DELETE/UPDATE 的舊值;INSERT 時為空。JOIN 比對變化列。觸發器內操作其他表若又觸發觸發器,形成級聯鏈。SQL Server 默認允許巢狀觸發(最多 32 級),可用 sp_configure 'nested triggers', 0 關閉。
SET CONTEXT_INFO 0x1 標記「已由觸發器處理」,下層觸發器檢測到則跳過。INSERT INTO Log SELECT ... FROM inserted 批量寫入。DISABLE TRIGGER trig_name ON table_name,大批量導入時關閉,導入後重開。sys.dm_exec_trigger_stats 關注 total_worker_time、total_logical_reads、execution_count。