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

Posted

技术标签:

【中文标题】是否有可能在同一个触发器运行中发生混合更新和插入?【英文标题】:Is it ever possible to have mixed updates and inserts occuring in the same trigger run? 【发布时间】:2016-11-18 14:42:17 【问题描述】:

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

例如,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】:

不,这是不可能的。

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

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

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

【讨论】:

我在问题中声明它不适用于merge 命令。您确定绝对没有触发器可能混合更新和插入的情况吗? @RăzvanPanda - 是的。除了合并之外,唯一触发触发器的其他语言元素是插入、更新、删除,很难理解为什么你会想象它们可能会导致这种情况。触发器触发每个语句,除了合并之外的每个语句只能执行一个操作。 不过可能还有其他情况。在投票/接受之前,我必须等待其他答案才能更清楚地获得。另外,需要自己尝试更多的东西。

以上是关于是否有可能在同一个触发器运行中发生混合更新和插入?的主要内容,如果未能解决你的问题,请参考以下文章

插入后的MySQL触发器

SQL Server在复制时触发

MySQL思考触发器是否应该在生产环境中使用?

MySQL思考触发器是否应该在生产环境中使用?

是否可以在 Redshift 中并行运行查询?

触发器定义中的 DELETE 语句问题