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
,就可以在审计表中插入任何行


对于同时更新的任意数量的行,这应该可以正常工作

谢谢你的回答。工作起来很有魅力!来自巴塞尔的问候:)