Sql server 基于SQL Server触发器的审核表,带有特定列的比较
我将尽可能地解释我的问题: 我有两个表:Sql server 基于SQL Server触发器的审核表,带有特定列的比较,sql-server,triggers,Sql Server,Triggers,我将尽可能地解释我的问题: 我有两个表:Foo和Foo\u 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(*) FRO
Foo
和Foo\u 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
或Foo.Qux
的值没有更改,它也会添加该行
有人知道如何让我的代码同时处理多个行更新吗?同时,我指的是同样的毫秒。试试这样:
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
创建触发器tr\u Foo\u Modified
论福
更新
作为
不计较
声明@rowcountint
插入到dbo.Foo_审计中(Bar、Qux、Baz)
挑选
i、 酒吧,i.Qux,i.Baz
从…起
插入i
内连接
已删除i.PrimaryKey=d.PrimaryKey上的d
哪里
i、 酒吧
或.Qux d.Qux
基本上,只要在删除的伪表(更新之前的旧值)和插入的伪表(更新之后的新值)之间修改了bar
或qux
,就可以在审计表中插入任何行
对于同时更新的任意数量的行,这应该可以正常工作 谢谢你的回答。工作起来很有魅力!来自巴塞尔的问候:)