Sql-Server
擷取 DML 更改的查詢文本
這可能是不可能的,但是如果不從插入/更新的記錄中進行 JOIN 並將它們逐列添加到審計表中,是否可以僅擷取完整的 DML 查詢文本,類似於使用針對錶執行 DML 事務時的以下邏輯:
IF ((@icount > 0) AND (@dcount = 0)) BEGIN SELECT @querytext = text FROM sys.dm_exec_requests er CROSS APPLY sys.dm_exec_sql_text(sql_handle) WHERE session_id = @@SPID END IF ((@dcount > 0) AND (@icount = 0)) BEGIN SELECT @querytext = text FROM sys.dm_exec_requests er CROSS APPLY sys.dm_exec_sql_text(sql_handle) WHERE session_id = @@SPID END
當我使用上述邏輯並嘗試將
@querytext
變數插入表時,它為NULL或傳入觸發器文本 - 這意味著它的上下文不是實際的插入或更新,因此可能無法擷取全文和必須進行逐列 DML 保存。
您是否考慮過為此使用跟踪?
https://technet.microsoft.com/en-us/library/ms191006%28v=sql.105%29.aspx
您可以為特定表配置它並將輸出儲存在表中。
我還必須指出,使用您嘗試使用的方法,您將只能擷取用於更改表的查詢。在某些情況下,您還將獲得常量值,例如
DECLARE @ID_to_delete INT SET @ID_to_delete = 123 DELETE FROM SampleTable WHERE ID = @ID_to_delete
而在大多數其他情況下,您只會得到用於更改數據的查詢,例如
DELETE FROM SampleTable WHERE ID IN( SELECT ID_to_delete FROM ToDeleteTable )