如果桌面应用程序使用 Windows 身份验证,您可以简单地使用 ORIGINAL_LOGIN() 或 SUSER_SNAME() 在触发代码中获取最终用户帐户名称。
对于共享 SQL 登录,一种方法是将最终用户名存储在 SQL 会话上下文中以供触发器使用。会话上下文允许您使用sp_set_session_context 过程存储名称/值对,并使用SESSION_CONTEXT 函数读取当前会话值。在打开新的 SQL 连接后,使用当前用户名调用 sp_set_session_context,以便触发器可以使用它来识别最终用户。
下面的示例 T-SQL 代码。此外,请参阅 this answer 了解设置/使用会话级别值的其他方法。
CREATE TRIGGER TR_YourTable
ON dbo.YourTable
FOR INSERT, UPDATE, DELETE
AS
DECLARE @TriggeredBy sysname = COALESCE(CAST(SESSION_CONTEXT(N'end-user-name') AS sysname), N'unknown');
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
BEGIN
INSERT INTO dbo.YourAuditTable (Action, SomeColumn, TriggeredBy)
SELECT 'updated', SomeColumn, @TriggeredBy
FROM deleted;
END
ELSE
BEGIN
IF EXISTS(SELECT 1 FROM inserted)
BEGIN
INSERT INTO dbo.YourAuditTable (Action, SomeColumn, TriggeredBy)
SELECT 'inserted', SomeColumn, @TriggeredBy
FROM inserted;
END
ELSE
BEGIN
INSERT INTO dbo.YourAuditTable (Action, SomeColumn, TriggeredBy)
SELECT 'deleted', SomeColumn, @TriggeredBy
FROM deleted;
END;
END;
GO
--Example T-SQL usage. Queries should be parameterized in application code.
EXEC sp_set_session_context N'end-user-name', N'me';
INSERT INTO dbo.YourTable (SomeColumn) VALUES('example');
GO