2017-01-08 73 views
0

我的应用程序有两个表(我试图创建一个bug跟踪器)。一个我可以添加一个记录/问题和一个问题的历史。在SQL Server上插入触发器以更改/审计历史记录

因此,第二个(Bugs_Shadow)表将与第一个(Bugs)一起创建新记录,然后,当有人尝试修复时,我可以更新表1上的问题。单击更新时,我希望它将整个更新行添加到第二个表,但也保留原始记录。因此,无论何时进行更改,它都会在Bugs_Shadow表中创建一条新记录。我希望这是有道理的?

我创造了这个触发:

CREATE TRIGGER [tr_Bugs_Insert] 
    ON [dbo].[Bugs] 
    AFTER UPDATE, INSERT 
    AS 
    BEGIN 
     INSERT INTO Bugs_Shadow (BugID, [User], Date, Subject, Description, [Source Code], [Current State]) 
     SELECT BugID, [User], Date, Subject, Description, [Source Code], [Current State] 
     FROM Bugs 

    END 
    GO 

它的工作这么远成在第二表所述相同条目,但是当我更新的第一个表中的条目,它做同样的事情在第2而我希望它创建一个与用户所做更改相同的新记录。

希望有一些帮助。这是我第一次尝试触发器,我花了一段时间才到达这个阶段。

感谢

回答

0

你需要触发的位置:

  • 一个后,在一个表中插入将其插入到其他
  • 一个以前更新在一个表中插入它到另一个

CREATE TRIGGER [tr_Bugs_Insert] 
    ON [dbo].[Bugs] 
    AFTER INSERT 
    AS 
    BEGIN 
     INSERT INTO Bugs_Shadow (BugID, [User], Date, Subject, Description, [Source Code], [Current State]) 
     SELECT BugID, [User], Date, Subject, Description, [Source Code], [Current State] 
     FROM Bugs 
END 
GO 

CREATE TRIGGER [tr_Bugs_Update] 
    ON [dbo].[Bugs] 
    BEFORE UPDATE 
    AS 
    BEGIN 
     INSERT INTO Bugs_Shadow (BugID, [User], Date, Subject, Description, [Source Code], [Current State]) 
     SELECT BugID, [User], Date, Subject, Description, [Source Code], [Current State] 
     FROM Bugs 
END 

EDIT

MS SQL不触发器之前支持,所以上面的无效。 您可以使用INSTEAD触发器。通过触发器,只有触发器被执行,而不是原始语句。 因此,您应该在该触发器中执行的操作是将旧值插入一个表中并更新另一个表。

欲了解更多信息,请参阅此问题: How can I do a BEFORE UPDATED trigger with sql server?

也有在那里指定替代解决方案的一些答案。

+0

感谢您的快速响应。但是,由于我得到以下错误:SQL80001:'BEFORE'附近的语法不正确。有任何想法吗? –

+0

它似乎期待'AFTER'而不是'BEFORE' –

+0

我的不好,MS SQL不支持BEFORE触发器。看到我更新的答案 – Kenneth