T-Sql

在將 Insert 的結果返回給客戶端之前,此觸發器是否總是完成?

  • June 10, 2020

我有以下審計觸發器。

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完成後,下一個呼叫將插入userIdsAuditEntries

額外的資訊:

  • 任何地方都不存在其他觸發器。
  • 客戶端使用 EntityFramework Core,所以有問題的時間是在SaveChangesAsync()返回之後。
  • AuditEntries表的 P​​rimaryKeyROWVERSIONdbo.Cust

問題是:此時是否AuditEntries保證存在或者這是我需要處理的比賽?

其他研究:

sql-server-觸發器執行

答案:Sql Triggers 是同步的還是非同步的

更新:由於預設的 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

例如

  1. 插入 dbo.Cust 值 (1,),(2,),(3,),(4,),(5,)
  2. 觸發 dbo.TR_MyTrigger
  3. 插入 dbo.Cust 值 (6,),(7,),(8,),(9,),(10,)
  4. 觸發 dbo.TR_MyTrigger
  5. 刪除 dbo.Cust …
  6. 觸發器 dbo.TR_MyTrigger#

每一步都在下一步之前完成

引用自:https://dba.stackexchange.com/questions/268844