Hikari Asked: 2021-09-30 09:51:12 +0800 CST2021-09-30 09:51:12 +0800 CST 2021-09-30 09:51:12 +0800 CST 在 DELETE 上使用触发器来检索原始 SQL 命令和执行此操作的用户 772 我正在尝试创建一个审核日志以在 MSSQL 2012 上的某些表上存储所有删除命令。 我需要的是执行它的用户名和执行的命令,然后我可以将它们插入到日志表中。 我找到了许多创建触发器的示例,但没有一个显示如何检索这些信息。 sql-server sql-server-2012 1 个回答 Voted Best Answer Aaron Bertrand 2021-09-30T10:22:25+08:002021-09-30T10:22:25+08:00 对于用户名,有一堆内置函数会返回当前用户名。它们并不完全相同,所以请选择- 我通常使用SUSER_SNAME(). 对于该命令,如果您使用的是受支持且非古董的版本(甚至 SQL Server 2014 也会这样做),您可以使用sys.dm_exec_input_buffer告诉您当前用户发送的最后一批(由 标识@@SPID),因此在触发器的正文中你可以有: INSERT dbo.LoggingTable(username, command<, other cols>) SELECT SUSER_SNAME(), event_info<, other data> FROM sys.dm_exec_input_buffer(@@SPID, NULL); 在 SQL Server 2012 上,它会变得丑陋得多。您需要一个 #temp 表来保存动态 SQL 执行的输出DBCC INPUTBUFFER: DECLARE @sql nvarchar(max) = N'DBCC INPUTBUFFER(@me) WITH NO_INFOMSGS;'; CREATE TABLE #dbcc ( EventType nvarchar(128), Parameters int, EventInfo nvarchar(max), UserName nvarchar(128) NOT NULL DEFAULT SUSER_SNAME() ); INSERT #dbcc(EventType, Parameters, EventInfo) EXEC sys.sp_executesql @sql, N'@me int', @@SPID; INSERT dbo.LoggingTable(username, command<, other cols>) SELECT UserName, EventInfo<, other data> FROM #dbcc;
对于用户名,有一堆内置函数会返回当前用户名。它们并不完全相同,所以请选择- 我通常使用
SUSER_SNAME()
.对于该命令,如果您使用的是受支持且非古董的版本(甚至 SQL Server 2014 也会这样做),您可以使用
sys.dm_exec_input_buffer
告诉您当前用户发送的最后一批(由 标识@@SPID
),因此在触发器的正文中你可以有:在 SQL Server 2012 上,它会变得丑陋得多。您需要一个 #temp 表来保存动态 SQL 执行的输出
DBCC INPUTBUFFER
: