在 SQL Server 資料庫應用中,觸發器是一種特殊的預存程序,它不像一般預存程序透過名稱直接呼叫,而是透過特定事件自動觸發執行。觸發器依附於特定資料表建立,與 INSERT、UPDATE、DELETE 等資料修改操作緊密關聯,可視為資料表的一部分。
SQL Server 主要提供兩大類觸發器:
本文重點探討 DML 觸發器中的 AFTER 觸發器,其基本語法如下:
CREATE TRIGGER trigger_name
ON table_name
AFTER {INSERT, UPDATE, DELETE}
AS
Sql_statements
[RETURN]
觸發器執行時會用到兩個特殊的記憶體常駐虛擬表:
兩者結構與觸發器所在資料表完全一致,僅存在於觸發器執行期間,是實現資料比對與級聯操作的核心。
當一個觸發器的動作引發另一個觸發器,形成鏈式反應,即為嵌套觸發器。SQL Server 支援最多 32 層嵌套,這為跨多張關聯資料表的級聯操作提供了強大支撐。
典型 BBS 論壇包含四張核心資料表,呈現多層一對多關係:
當管理員刪除一個大版塊時,必須同步清除其下所有分論壇、主題帖、回覆,否則會產生孤立資料,破壞完整性。
為三張父表分別建立 AFTER DELETE 觸發器,形成嵌套鏈路:
-- 1. 大版塊刪除 → 級聯刪除分論壇
CREATE TRIGGER DelType ON dbo.BBS_Type
AFTER DELETE AS
BEGIN
DECLARE @typeid INT;
SELECT @typeid = TypeID FROM deleted;
DELETE FROM dbo.BBS_LanMu WHERE TypeID = @typeid;
END;
-- 2. 分論壇刪除 → 級聯刪除主題帖
CREATE TRIGGER DelLanmu ON dbo.BBS_LanMu
AFTER DELETE AS
BEGIN
DECLARE @lmid INT;
SELECT @lmid = LMID FROM deleted;
DELETE FROM dbo.BBS_Topic WHERE LMID = @lmid;
END;
-- 3. 主題帖刪除 → 級聯刪除回覆
CREATE TRIGGER DelTopic ON dbo.BBS_Topic
AFTER DELETE AS
BEGIN
DECLARE @tid INT;
SELECT @tid = TID FROM deleted;
DELETE FROM dbo.BBS_Reply WHERE TID = @tid;
END;
整個過程在資料庫引擎層自動完成,無需應用層編寫複雜遞迴邏輯,極大簡化業務代碼,確保資料一致性與完整性。
需在資料庫屬性中將「遞歸觸發器已啟用」設為 TRUE,否則嵌套鏈路會中斷。
觸發器是維護資料完整性、實現跨表自動化業務邏輯的利器。善用嵌套觸發器可將多層級聯操作封裝於資料庫層,既提升效能,又降低應用層複雜度,是大型關聯式資料庫系統不可或缺的組件。