SQL Server中的表历史触发器?

时间:2010-11-17 00:18:15

标签: sql-server triggers

我想创建一个触发器,该触发器使用插入的值以及更新值之前和之后写入历史记录表。我还想尽可能多地包含有关更新帐户的信息。我如何在触发器中包含帐户信息?

这是我到目前为止所做的:

CREATE TRIGGER [update_history] ON MyTable
FOR UPDATE
AS
INSERT MyTable_History (id, BudgetNumber, PositionNumber, ModifiedDate, action, userId)
SELECT id, BudgetNumber, PositionNumber, GETDATE(), 'BEFORE UPDATE', '???'
FROM deleted

INSERT MyTable_History (id, BudgetNumber, PositionNumber, ModifiedDate, action, userId)
SELECT id, BudgetNumber, PositionNumber, GETDATE(), 'AFTER UPDATE', '???'
FROM inserted

我用什么代替'???'?

3 个答案:

答案 0 :(得分:5)

如果每个用户都有一个帐户,您可以使用SYSTEM_USER功能来确定当前用户。但是,如果您的所有连接都通过代理帐户,这在大多数网站设置中都是典型的,那么您必须依赖于传递给Update语句的正确userId:

CREATE TRIGGER [update_history] ON MyTable
FOR UPDATE
AS
INSERT MyTable_History (id, BudgetNumber, PositionNumber, ModifiedDate, action, userId)
SELECT id, BudgetNumber, PositionNumber, GETDATE(), 'BEFORE UPDATE', inserted.userId
FROM MyTable
    Join inserted
        On inserted.id = MyTable.id

INSERT MyTable_History (id, BudgetNumber, PositionNumber, ModifiedDate, action, userId)
SELECT id, BudgetNumber, PositionNumber, GETDATE(), 'AFTER UPDATE', userId
FROM inserted

答案 1 :(得分:3)

FWIW,如果您使用的是SQL Server 2008,除了编写触发器以跟踪数据更改之外,还有一个更好的选择。看看Change Data Capture

答案 2 :(得分:0)

使用ORIGINAL_LOGIN()

你可以看到它在这里做了什么的进一步定义 SQL Server - current user name