基于SQL Server触发器的审计表,包含特定列的比较

时间:2015-11-25 12:10:39

标签: sql-server triggers

我会尝试尽可能基本地解释我的问题:

我有两个表:FooFoo_Audit

在行更新时,我想将行复制到Foo_Audit表,但前提是Foo.BarFoo.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}的值,也会添加该行没有改变。

有谁知道,如何让我的代码同时处理多行更新?同时我的意思是相同的毫秒。

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伪表(在之前使用旧值)之间修改了quxDeleted,只需在审核表中插入任何行UPDATE}和Inserted伪表格( UPDATE之后的新值)。

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