SQL Server ベースの環境を使用していて、実行されたクエリに起因したエラーを SQL Server 側でロギングしたいという要望を受けることがあります。
そのような場合に、SQL Server 観点での情報取得として拡張イベントを使用したロギングの利用を検討することができます。
拡張イベントを使用したエラーの取得
拡張イベントでクエリが正常に完了しなかった際のイベントと、エラーレポートについて取得することでエラーが発生したクエリをある程度はロギングすることができます。
以下はサンプルのクエリとなりますが、次のクエリで拡張イベントを作成することができます。
CREATE EVENT SESSION [Query Error] ON SERVER
ADD EVENT sqlserver.error_reported(
ACTION(sqlserver.client_app_name,sqlserver.session_id,sqlserver.sql_text)
WHERE ([severity]>=(11) AND [severity]<=(16))),
ADD EVENT sqlserver.rpc_completed(
ACTION(sqlserver.client_app_name,sqlserver.sql_text)
WHERE ([result]<>'OK')),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.client_app_name,sqlserver.sql_text)
WHERE ([result]<>'OK'))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_MULTIPLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
クエリの完了については OK 以外を取得しており、error_reported については、ユーザー起因のエラー (重要度 11~16) を取得するようにしています。
このような拡張イベントを使用するとエラーがあった場合に拡張イベントでログを取得することができるようになります。
SQL Server 2025 の機能拡張
SQL Server 2025 では拡張イベントの機能拡張が行われています。
タイム バインド イベント セッション が使用できるようになり、開始して一定期間が経過したら自動的に停止する拡張イベントを作成できるようになりました。
先ほどのクエリであれば、次のようなクエリに変更 (MAX_DURATION = 5 MINUTES) することで、開始後、指定した期間経過すると自動的に拡張イベントが停止されます。
CREATE EVENT SESSION [Query Error] ON SERVER
ADD EVENT sqlserver.error_reported(
ACTION(sqlserver.client_app_name,sqlserver.session_id,sqlserver.sql_text)
WHERE ([severity]>=(11) AND [severity]<=(16))),
ADD EVENT sqlserver.rpc_completed(
ACTION(sqlserver.client_app_name,sqlserver.sql_text)
WHERE ([result]<>'OK')),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.client_app_name,sqlserver.sql_text)
WHERE ([result]<>'OK'))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_MULTIPLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF,
MAX_DURATION = 5 MINUTES)
GO