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