是否有可能在同一个触发器 运行 中混合更新和插入?
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 两个结果集。一个用于插入,一个用于更新。
当触发器被 运行 时,插入和删除的行数是否可能不为零 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 两个结果集。一个用于插入,一个用于更新。