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

时间:2016-11-18 14:42:18

标签: sql sql-server sql-server-2008 database-trigger

当一个触发器运行时,插入和删除表中的行数可能是非零(基本上是同时处理插入和更新的混合)?

例如,inserted表可能有2行,delete会有1行(匹配插入的1行),这意味着触发器正在处理1更新的混合(插入和删除表中的匹配行)和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操作的完整列表,那么在同一触发器运行中将会出现混合插入和更新的情况永远不会出现这种情况。

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。

您可以从下面看到它的工作原理。

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); 

返回两个结果集。一个用于插入,另一个用于更新。

enter image description here