创建触发器来记录影响表的 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语句执行。
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)
将结果与 DMV 连接以检索有关执行的其他信息:
WITH CapturedResults AS ( ... ) , StackData AS ( ... ) SELECT ... FROM StackData AS sd ...
这些方法提供了一种识别正在影响的 SQL 语句的方法该表,让您可以进一步调查并解决任何问题。
以上是如何记录影响特定表的SQL语句?的详细内容。更多信息请关注PHP中文网其他相关文章!