我想创建一个触发器,该触发器使用插入的值以及更新值之前和之后写入历史记录表。我还想尽可能多地包含有关更新帐户的信息。我如何在触发器中包含帐户信息?
这是我到目前为止所做的:
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
我用什么代替'???'?
答案 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