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

SQL Server AFTER 觸發器完整指南:建立、範例與實務操作

     編輯:關於SqlServer

SQL Server 的 DML 觸發器依觸發時機與實作語言可分為 AFTER 觸發器、INSTEAD OF 觸發器 以及 CLR 觸發器。本文聚焦於最常用的 AFTER 觸發器,詳細說明其特性、建立語法、實戰範例與注意事項。

觸發器類型快速比較

類型觸發時機典型用途
AFTERINSERT/UPDATE/DELETE 執行完成後、約束檢查通過後稽核記錄、衍生資料維護、跨表同步
INSTEAD OF約束檢查之前,可取代原 DML 動作視圖更新、複雜驗證邏輯、攔截並轉向操作
CLR可實作為 AFTER 或 INSTEAD OF,也可作為 DDL 觸發器需 .NET 程式庫支援的複雜運算

建立 AFTER 觸發器的限制

在觸發器本文中不可使用下列陳述式:

  • 資料庫管理:ALTER DATABASE、CREATE DATABASE、DROP DATABASE
  • 備份/還原:BACKUP、RESTORE、LOAD DATABASE、LOAD LOG
  • 系統設定:RECONFIGURE

AFTER 觸發器核心特性

  • 單一資料表可建立多個 AFTER 觸發器(名稱需唯一)。
  • 每個觸發器僅能綁定一個資料表,但可同時處理 INSERT、UPDATE、DELETE 三種操作。
  • 提供兩個虛擬資料表:inserted(新資料)與 deleted(舊資料),結構與基底表相同。

實戰範例:主從表級聯刪除

情境:刪除主表 PriTable 訂單時,自動清除明細表 DetailTable 對應資料。

1. 建立測試資料表

USE AdventureWorks;
GO

CREATE TABLE PriTable (
    OrderID int IDENTITY(1,1),
    OrderTotal money
);
GO

CREATE TABLE DetailTable (
    OrderID int,
    ProductID int,
    ProductCount int NOT NULL,
    Price money
);
GO

-- 範例資料
INSERT INTO PriTable VALUES (2100.00), (1000.00);
INSERT INTO DetailTable VALUES (1,1,10,110.00), (1,2,10,100.00), (2,2,10,100.00);
GO

2. 建立 AFTER DELETE 觸發器

CREATE TRIGGER PriTrigger
ON PriTable
AFTER DELETE
AS
BEGIN
    DELETE FROM DetailTable
    WHERE OrderID IN (SELECT OrderID FROM deleted);
    
    -- 示範用 PRINT,實務上建議移除或改用 RAISERROR/LOG
    PRINT N'已刪除 DetailTable 相關明細資料';
END;
GO

3. 執行測試

-- 刪除主表 OrderID=1 的訂單
DELETE FROM PriTable WHERE OrderID = 1;

-- 檢查結果
SELECT * FROM PriTable;
SELECT * FROM DetailTable;

觸發器會自動刪除 DetailTable 中 OrderID=1 的三筆明細。

重要觀念:虛擬資料表 inserted / deleted

  • INSERT:新資料同時寫入基底表與 inserted。
  • DELETE:被刪除資料複製到 deleted。
  • UPDATE:視為「先刪除後插入」,舊值進 deleted,新值進 inserted 與基底表。

這兩個虛擬表由 SQL Server 自動建立與管理,僅存在於觸發器執行期間。

特殊行為:未影響任何資料列仍會觸發

若執行 DELETE FROM PriTable WHERE OrderID = 3(該筆不存在),觸發器依然會啟動,此時 deleted 為空表。此特性需注意,避免在觸發器中執行高成本操作導致效能浪費。

最佳實務建議

  1. 避免在觸發器中使用 PRINT、SELECT * 等回傳結果的陳述式,以免干擾呼叫端應用程式。
  2. 善用 SET NOCOUNT ON 減少網路傳輸。
  3. 觸發器邏輯應保持簡潔;複雜業務邏輯建議移至預存程序或應用層處理。
  4. 謹慎使用巢狀觸發器,必要時以 sp_configure 'nested triggers', 0 關閉。

AFTER 觸發器是資料完整性與稽核的利器,善用虛擬表 inserted/deleted 即可實作靈活的資料同步邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved