在SQL Server上插入触发器以获取更改/审核历史记录

时间:2017-01-08 22:57:04

标签: c# sql-server database triggers bug-tracker

我的应用程序上有两个表(我试图创建一个bug跟踪器)。一个我可以添加记录/问题,一个是问题的历史。

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

我创建了这个触发器:

        self.confirm(true) do
          self.delete_thing_elements[index-1].click
          sleep 5
        end

它可以在第二个表中创建相同的条目但是当我更新第一个表中的条目时,它在第二个表中执行相同的操作,而我希望它创建一个相同的新记录来自用户所做的更改。

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

由于

1 个答案:

答案 0 :(得分: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

编辑

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

有关详细信息,请参阅此问题: How can I do a BEFORE UPDATED trigger with sql server?

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