建立測試環境
USE TempDB
GO
DROP TABLE IF EXISTS tblTrigger
DROP TABLE IF EXISTS tblLog
DROP TRIGGER IF EXISTS triInsert
CREATE TABLE tblTrigger (ID int identity(1,1) Primary key , InsertTime datetime)
CREATE TABLE tblLog (ID int , InsertTime datetime)
GO
CREATE TRIGGER triInsert
ON tblTrigger
AFTER INSERT -- 限定 insert 時觸發
AS
BEGIN
INSERT INTO tblLog (ID , InsertTime)
SELECT ID , GETDATE()
FROM inserted
END
GO
驗證方式
透過 SQL Profile 來觀察 Trigger 觸發情況,請參考該篇筆記開啟 - [SQL] SQL Profile 側錄 Trigger,下述測試案例圖片,紅框代表批次 ( batch )、綠框代表 Trigger 觸發
測試案例 1 - 基礎 insert
測試語法
測試案例 2 - GO 拆分批次
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger VALUES(@now)
INSERT INTO tblTrigger VALUES(@now)
INSERT INTO tblTrigger VALUES(@now)
測試結果:一個 batch 內 Trigger 被觸發三次,每次觸發都 insert 一筆資料測試案例 2 - GO 拆分批次
測試語法
測試案例 3 - GO 重覆執行
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger (InsertTime) VALUES(@now)
GO
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger VALUES(@now)
INSERT INTO tblTrigger VALUES(@now)
GO
測試結果:GO 會拆分 batch,所以第一個 batch 內會觸發 Trigger 一次,第二個 batch 內會觸發 Trigger 兩次,每次觸發都 insert 一筆資料測試案例 3 - GO 重覆執行
測試語法
測試案例 4 - 資料表值建構函式
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger (InsertTime) VALUES(@now)
GO 3
測試結果:GO 數字會重覆執行 insert,所以是三個 batch 內各含一次觸發 Trigger,每次觸發都 insert 一筆資料
測試案例 4 - 資料表值建構函式
ˇ
測試語法
測試案例 5 - insert select
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger (InsertTime) VALUES
(@now) , (@now) , (@now)
GO
測試結果:一個 batch 內觸發一次 Trigger,該觸發會 insert 多筆資料測試案例 5 - insert select
測試語法
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger (InsertTime)
SELECT @now
FROM tblTrigger
WHERE ID BETWEEN 22 AND 25
測試結果:一個 batch 內觸發一次 Trigger,該觸發會 insert 多筆資料