如何在SQL Server触发器中测试多行操作?

Tom*_*Tom 4 database sql-server

我的幼儿园SQL Server告诉我,在插入和删除的伪表中可能会触发多行触发器.考虑到这一点,我主要编写我的触发器代码,经常导致一些基于游标的cludge.现在我真的只能测试它们一次射击一行.如何生成多行触发器并且SQL Server实际上是否会发送多行触发器?我可以设置一个标志,以便SQL Server只会触发单行触发器吗?

Mit*_*eat 10

触发器定义应始终处理多行.

取自SQLTeam:

-- BAD Trigger code following:

CREATE TRIGGER trg_Table1 
ON Table1 
For UPDATE
AS
DECLARE @var1 int, @var2 varchar(50)

SELECT @var1 = Table1_ID, @var2 = Column2
FROM inserted

UPDATE Table2
SET SomeColumn = @var2
WHERE Table1_ID = @var1
Run Code Online (Sandbox Code Playgroud)

上面的触发器仅适用于inserted表中的最后一行.

这是你应该如何实现它:

CREATE TRIGGER trg_Table1 
ON Table1 
FOR UPDATE
AS

UPDATE t2
SET SomeColumn = i.SomeColumn
FROM Table2 t2
INNER JOIN inserted i
ON t2.Table1_ID = i.Table1_ID
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 4

是的,如果一条语句影响多行,则应通过单个触发器调用来处理它,因为您可能希望恢复整个事务。不可能在逻辑上将其拆分为单独的触发器调用,并且我不认为 SQL Server 提供这样的标志。您可以通过发出影响多行的 UPDATE 或 DELETE 语句,使 SQL Server 调用多行触发器。

  • 我会更进一步说,您的触发器应该始终考虑多行,无论您是否希望以这种方式调用它们。 (4认同)