テーブルに影響を与える SQL をログに記録するトリガーの作成
テーブル更新のソースが不明な状況に直面した場合、これが不可欠になります犯人を特定するために。これを実現するには、影響を受けるテーブルにトリガーを作成して、更新をトリガーした実行された SQL をキャプチャします。この記事では、この問題に対する 2 つのアプローチを説明します。1 つは単純な SQL トリガーを使用する方法、もう 1 つは SQL Server 2008 拡張イベントを使用したより包括的なソリューションです。
SQL トリガー方法:
ストアド プロシージャを実行して、トリガーした SQL ステートメントを記録する、問題のテーブルのトリガーupdate.
CREATE TRIGGER [triggerName] ON [tableName] AFTER UPDATE AS BEGIN EXEC [storedProcedureName] END
ストアド プロシージャで、sp_WhoIsActive:
CREATE PROCEDURE [storedProcedureName] AS BEGIN DECLARE @sql_statement NVARCHAR(MAX) EXEC sp_WhoIsActive @output_text = @sql_statement OUTPUT END
拡張イベント メソッド (SQL Server 2008):
を使用して SQL ステートメントをログに記録します。この方法には、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 中国語 Web サイトの他の関連記事を参照してください。