是否有可能在同一个触发器运行中发生混合更新和插入?
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 - 是的。除了合并之外,唯一触发触发器的其他语言元素是插入、更新、删除,很难理解为什么你会想象它们可能会导致这种情况。触发器触发每个语句,除了合并之外的每个语句只能执行一个操作。
不过可能还有其他情况。在投票/接受之前,我必须等待其他答案才能更清楚地获得。另外,需要自己尝试更多的东西。以上是关于是否有可能在同一个触发器运行中发生混合更新和插入?的主要内容,如果未能解决你的问题,请参考以下文章