首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MS SQL Server 觸發器應用實戰:INSERT/UPDATE/DELETE 與巢狀觸發器

     編輯:關於SqlServer

本節透過大量實例,展示三類 DML 觸發器的寫法與關鍵技巧,包含檢查欄位變更的 IF UPDATE()、COLUMNS_UPDATED(),以及巢狀觸發器的級聯應用。

12.9.1 INSERT 觸發器應用

當資料插入時,inserted 邏輯表保存新增列的副本。觸發器可透過查詢 inserted 進行驗證、同步其他表、記錄稽核等。

INSERT 範例1 INSERT 範例2 INSERT 範例3

12.9.2 UPDATE 觸發器應用

UPDATE 觸發器同時涉及 deleted(舊值)與 inserted(新值)兩個邏輯表。分為兩類:

  • 一般 UPDATE 觸發器:處理整列更新。
  • 檢查欄位變更觸發器:僅關心特定欄位是否被修改,使用 IF UPDATE(column) 或 IF (COLUMNS_UPDATED()) 位元遮罩判斷。

UPDATE 一般範例 檢查欄位變更語法 IF UPDATE 範例 COLUMNS_UPDATED 範例

注意:執行上述範例前,必須先移除 title 資料表相關的主外鍵關聯,否則觸發器無法觸發。

移除 FK 1 移除 FK 2 移除 FK 3 移除 FK 4

12.9.3 DELETE 觸發器應用

刪除操作將被刪除列存入 deleted 邏輯表。觸發器可在此階段攔截刪除、轉存刪除記錄、執行級聯清理等。

12.9.4 巢狀觸發器

觸發器執行的 DML 若觸發另一資料表的觸發器,即形成巢狀。SQL Server 支援最多 32 層。可透過 sp_configure 'nested triggers' 停用。

巢狀範例1 巢狀範例2 巢狀範例3 巢狀範例4

注意:執行巢狀範例前,需移除 sales 資料表的主外鍵關聯。

關鍵技巧總結

  • 善用 inserted/deleted 邏輯表比對新舊值。
  • IF UPDATE(col) 單一欄位檢查;COLUMNS_UPDATED() 多欄位位元遮罩檢查。
  • 巢狀觸發器威力大但難除錯,建議加入 TRIGGER_NESTLEVEL() 守衛條件。
  • 測試前確認約束條件(PK/FK)不會阻擋觸發器觸發。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved