2015-11-25 26 views
1

我会尽量解释我的问题,基本的可能:SQL服务器触发与比较基础的审计表中特定列

我有两个表: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.BarFoo.Qux的值未发生更改,它也会添加该行。

有谁知道,如何让我的代码同时在多行更新上工作?同时我的意思是毫秒。

回答

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 

基本上,只要插入任何行到您的审计表,如果barqux已经在Deleted伪代码表之间修改和(与旧值UPDATE之前) Inserted伪表(新值UPDATE)。

这应该适用于任何数量的行一次更新。

+1

感谢您的回答。奇迹般有效!来自巴塞尔的问候:) – soumer