Sql-Server
在 DELETE 上使用觸發器來檢索原始 SQL 命令和執行此操作的使用者
我正在嘗試創建一個審核日誌以在 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;