我会尝试尽可能基本地解释我的问题:
我有两个表:Foo
和Foo_Audit
。
在行更新时,我想将行复制到Foo_Audit
表,但前提是Foo.Bar
或Foo.Qux
的值更改。 Foo.Baz
需要忽略。
这是我的代码:
CREATE TRIGGER tr_Foo_Modified
ON Foo
FOR UPDATE
AS
SET NOCOUNT ON
DECLARE @rowCount int
SELECT @rowCount = COUNT(*)
FROM (SELECT Bar, Qux
FROM inserted
EXCEPT
SELECT Bar, Qux
FROM deleted) #TempTable
IF (@rowCount > 0)
BEGIN
INSERT INTO Foo_Audit(Bar, Qux, Baz)
SELECT
Bar, Qux, Baz
FROM Foo
END
如果我通过当时只更新一行来测试它,那么一切都运行得很好。但是当同时更新多行(~400)时,有时会将同一行多次添加到Foo_Audit
表中,即使Foo.Bar
或{{1}的值,也会添加该行没有改变。
有谁知道,如何让我的代码同时处理多行更新?同时我的意思是相同的毫秒。
答案 0 :(得分:1)
尝试这样的事情:
CREATE TRIGGER tr_Foo_Modified
ON Foo
FOR UPDATE
AS
SET NOCOUNT ON
DECLARE @rowCount int
INSERT INTO dbo.Foo_Audit(Bar, Qux, Baz)
SELECT
i.Bar, i.Qux, i.Baz
FROM
Inserted i
INNER JOIN
Deleted d ON i.PrimaryKey = d.PrimaryKey
WHERE
i.Bar <> d.Bar
OR .Qux <> d.Qux
基本上,如果在bar
伪表(在之前使用旧值)之间修改了qux
或Deleted
,只需在审核表中插入任何行UPDATE
}和Inserted
伪表格( UPDATE
之后的新值)。
对于一次更新的任意数量的行,这应该可以正常工作。