Sql-Server

擷取 DML 更改的查詢文本

  • May 12, 2016

這可能是不可能的,但是如果不從插入/更新的記錄中進行 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 )

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