是否有可能在同一个触发器 运行 中混合更新和插入?

Is it ever possible to have mixed updates and inserts occuring in the same trigger run?

当触发器被 运行 时,插入和删除的行数是否可能不为零 table(基本上同时处理插入和更新的混合时间)?

例如,inserted table 可能有 2 行,delete 可能有 1 行(匹配 inserted 中的 1 行),这意味着触发器正在处理 1 个更新的混合(匹配行在插入和删除 tables) 和 1 个插入中。

更新

显然,使用 merge 命令可能会导致 1 次触发 运行 对于所有已完成的更改,请参阅: Merge statement and after triggers on target table 或否,需要对此进行测试.

根据https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ merge 命令导致触发器 运行 多次,将更新和插入分开。

解决方案更新

假设 this 是完整的 DML 操作列表,那么将永远不会出现在同一触发器中处理混合插入和更新的情况 运行。

不,这不可能。

你可以从下面看到它是如何工作的。

CREATE TABLE T1
  (
     X INT
  )

INSERT INTO T1
VALUES     (1);

GO

CREATE TRIGGER TR
ON T1
FOR UPDATE, INSERT
AS
    SELECT (SELECT COUNT(*)
            FROM   inserted) AS InsertedCount,
           (SELECT COUNT(*)
            FROM   deleted)  AS DeletedCount

GO

MERGE INTO T1
USING (VALUES (1),
              (2),
              (3)) V(X)
ON T1.X = V.X
WHEN MATCHED THEN
  UPDATE SET X = V.X
WHEN NOT MATCHED THEN
  INSERT (X)
  VALUES (X); 

其中 returns 两个结果集。一个用于插入,一个用于更新。