建立觸發器來記錄影響表的SQL
當面對表更新來源未知的情況時,它就變得至關重要找出罪魁禍首。為此,您可以在受影響的表上建立觸發器來捕獲觸發更新的已執行 SQL。本文示範了解決此問題的兩種方法:使用簡單的 SQL 觸發器和使用 SQL Server 2008 擴充事件的更全面的解決方案。
SQL 觸發器方法:
建立一個在相關表上觸發,執行預存程序來記錄觸發更新的 SQL 語句。
CREATE TRIGGER [triggerName] ON [tableName] AFTER UPDATE AS BEGIN EXEC [storedProcedureName] END
在儲存中過程,使用sp_WhoIsActive 記錄SQL 語句:
CREATE PROCEDURE [storedProcedureName] AS BEGIN DECLARE @sql_statement NVARCHAR(MAX) EXEC sp_WhoIsActive @output_text = @sql_statement OUTPUT END
擴充事件方法(SQL Server 2008):
擴充事件方法(SQL Server 2008):CREATE EVENT SESSION [sessionName] ON SERVER ADD EVENT sqlserver.sql_statement_completed( ACTION (package0.callstack, sqlserver.session_id, sqlserver.sql_text, sqlserver.tsql_stack) WHERE (object_id = ' + CAST(OBJECT_ID('[affectedTable]') AS VARCHAR(10)) + ') ) ADD TARGET package0.asynchronous_file_target (set filename = 'path\to\filename.xel', metadatafile = 'path\to\filename.xem') ALTER EVENT SESSION [sessionName] ON SERVER STATE = START
此方法涉及建立捕獲詳細資訊的擴展事件會話關於SQL語句執行。
EXEC sp_executesql 'ALTER EVENT SESSION [sessionName] ON SERVER STATE = STOP' SELECT CONVERT(XML, event_data) AS data FROM sys.fn_xe_file_target_read_file('path\to\filename.xel', 'path\to\filename.xem', NULL, NULL)
執行更新後,停止會話並解析捕獲的資料檢索 SQL 語句。
WITH CapturedResults AS ( ... ) , StackData AS ( ... ) SELECT ... FROM StackData AS sd ...
將結果與DMV 連接以檢索有關執行的其他資訊:
這些方法提供了一種識別正在影響的SQL 語句的方法該表,讓您可以進一步調查並解決任何問題。以上是如何記錄影響特定表的SQL語句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!