T-Sql
在將 Insert 的結果返回給客戶端之前,此觸發器是否總是完成?
我有以下審計觸發器。
CREATE OR ALTER TRIGGER dbo.TR_MyTrigger ON dbo.Cust AFTER INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON; DECLARE @EntityState AS SMALLINT; SET @EntityState = (CASE WHEN EXISTS(SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED) THEN 3 -- Updated WHEN EXISTS(SELECT * FROM INSERTED) THEN 4 -- Inserted WHEN EXISTS(SELECT * FROM DELETED) THEN 2 -- Deleted ELSE NULL END) IF @EntityState = 4 BEGIN UPDATE Cust SET Created = GETDATE(), Updated = GETDATE() FROM INSERTED I WHERE Cust.BinId = I.BinId END ELSE IF @EntityState = 3 BEGIN UPDATE Cust SET Updated = GETDATE() FROM INSERTED I WHERE Cust.BinId = I.BinId END IF @EntityState <> 2 BEGIN INSERT INTO AuditEntries (SomeColumns..) SELECT SomeColumns.. FROM INSERTED I; END ELSE BEGIN INSERT INTO AuditEntries (SomeColumns..) SELECT SomeColumns.. FROM DELETED I; END END;
當客戶端(API 伺服器)呼叫寫入表
Cust
完成後,下一個呼叫將插入userIds
表AuditEntries
。額外的資訊:
- 任何地方都不存在其他觸發器。
- 客戶端使用 EntityFramework Core,所以有問題的時間是在
SaveChangesAsync()
返回之後。AuditEntries
表的 PrimaryKeyROWVERSION
是dbo.Cust
問題是:此時是否
AuditEntries
保證存在或者這是我需要處理的比賽?其他研究:
更新:由於預設的 T-Sql 配置,上述觸發器不會通過任何更新操作的直接遞歸進入循環。請參閱:遞歸觸發器
找到了一個回答我原來的問題的 SO this am:事務中的觸發器是否僅在事務送出時觸發?
從觸發器中刪除更新
CREATE OR ALTER TRIGGER dbo.TR_MyTrigger ON dbo.Cust AFTER INSERT, DELETE AS BEGIN
當您刪除 UPDATE 觸發器時,案例 4 和 3 不會再次觸發觸發器。
因此,只有當您插入或刪除時,觸發器才會執行,並更新 Cust 或插入 AuditEntries
使用這個 AFTER UPDATE TRiGGER,您將創建一個循環。
因此,如果需要,您應該只為更新編寫另一個觸發器。
回答你的問題
觸發器將在 dbo.Cust 的 INSER 或 DELETE 之後執行,並將在啟動另一個命令之前完全執行,這是因為您將觸發器定義為 FOR EACH STATEMENT
例如
- 插入 dbo.Cust 值 (1,),(2,),(3,),(4,),(5,)
- 觸發 dbo.TR_MyTrigger
- 插入 dbo.Cust 值 (6,),(7,),(8,),(9,),(10,)
- 觸發 dbo.TR_MyTrigger
- 刪除 dbo.Cust …
- 觸發器 dbo.TR_MyTrigger#
每一步都在下一步之前完成