星期一, 6月 26, 2023

[SQL] Trigger - insert 觸發

該 論壇問題 討論 insert、update、delete 時 Trigger 觸發情況 (單筆、多筆),對於 insert 觸發情況沒有很肯定,驗證並筆記

建立測試環境
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

測試語法
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger VALUES(@now)
INSERT INTO tblTrigger VALUES(@now)
INSERT INTO tblTrigger VALUES(@now)
測試結果:一個 batch 內 Trigger 被觸發三次,每次觸發都 insert 一筆資料

[SQL] Trigger - insert 觸發-1

測試案例 2 - 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 一筆資料

[SQL] Trigger - insert 觸發-2

測試案例 3 - GO 重覆執行

測試語法
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger (InsertTime) VALUES(@now)
GO 3
測試結果:GO 數字會重覆執行 insert,所以是三個 batch 內各含一次觸發 Trigger,每次觸發都 insert 一筆資料

[SQL] Trigger - insert 觸發-3

測試案例 4 - 資料表值建構函式
ˇ
測試語法
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger (InsertTime) VALUES
	(@now) , (@now) , (@now)
GO
測試結果:一個 batch 內觸發一次 Trigger,該觸發會 insert 多筆資料

[SQL] Trigger - insert 觸發-4

測試案例 5 - insert select 

測試語法
DECLARE @now datetime = getdate()
INSERT INTO tblTrigger (InsertTime) 
SELECT @now
FROM tblTrigger
WHERE ID BETWEEN 22 AND 25
測試結果:一個 batch 內觸發一次 Trigger,該觸發會 insert 多筆資料

[SQL] Trigger - insert 觸發-5

沒有留言:

張貼留言