Sql-Server

在 DELETE 上使用觸發器來檢索原始 SQL 命令和執行此操作的使用者

  • September 29, 2021

我正在嘗試創建一個審核日誌以在 MSSQL 2012 上的某些表上儲存所有刪除命令。

我需要的是執行它的使用者名和執行的命令,然後我可以將它們插入到日誌表中。

我找到了許多創建觸發器的範例,但沒有一個顯示如何檢索這些資訊。

對於使用者名,有一堆內置函式會返回目前使用者名。它們並不完全相同,所以請選擇- 我通常使用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;

引用自:https://dba.stackexchange.com/questions/300346