システム全体のロギングを実装しようとしています。これは、dabataseで失敗したストアドプロシージャの実行をすべてログに記録し、拡張イベントを見ています。SQL Serverロギングに失敗したクエリ
私はいくつかの研究を行ってきたし、次のコードを使用して、失敗したステートメントをキャプチャするために非常に簡単そうです:私は、すぐにテーブルに失敗したステートメントを保存したいのは、Logs.Errors
それを呼びましょうが、私と思いますしかし
--Create an extended event session
CREATE EVENT SESSION what_queries_are_failing ON SERVER
ADD EVENT sqlserver.error_reported (
ACTION (sqlserver.sql_text
, sqlserver.tsql_stack
, sqlserver.database_id
, sqlserver.username
)
WHERE ([severity] > 10)
)
ADD TARGET package0.asynchronous_file_target (
SET filename = 'C:\XEventSessions\what_queries_are_failing.xel'
, metadatafile = 'C:\XEventSessions\what_queries_are_failing.xem'
, max_file_size = 5
, max_rollover_files = 5
)
WITH (MAX_DISPATCH_LATENCY = 5 SECONDS)
GO
-- Start the session
ALTER EVENT SESSION what_queries_are_failing ON SERVER STATE = START
GO
;WITH events_cte
AS (
SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP), xevents.event_data.value('(event/@timestamp)[1]', 'datetime2')) AS [err_timestamp]
, xevents.event_data.value('(event/data[@name="severity"]/value)[1]', 'bigint') AS [err_severity]
, xevents.event_data.value('(event/data[@name="error_number"]/value)[1]', 'bigint') AS [err_number]
, xevents.event_data.value('(event/data[@name="message"]/value)[1]', 'nvarchar(512)') AS [err_message]
, xevents.event_data.value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS [sql_text]
, xevents.event_data
FROM sys.fn_xe_file_target_read_file('S:\XEventSessions\what_queries_are_failing*.xel', 'S:\XEventSessions\what_queries_are_failing*.xem', NULL, NULL)
CROSS APPLY (
SELECT CAST(event_data AS XML) AS event_data
) AS xevents
)
SELECT *
FROM events_cte
ORDER BY err_timestamp;
をそれを行う方法を見つけることができず、上位の方法はスケジュールされた仕事として働かなければなりませんでした。 Logs.LogError
手順はDBCC INPUTBUFFER();
を利用しているが、それはパラメータ、実行されただけで正確な手順をキャプチャしません
CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
SELECT 1;
END TRY
BEGIN CATCH
EXECUTE Logs.PrintError;
EXECUTE Logs.LogError;
END CATCH
END
:
は今のところ、私たちの手順は、そのように見えます。それは私がそれから得ることができるすべてです。私はそれが可能だ場合、まっすぐにいくつかのテーブルにレコードを挿入する文全体またはXEをキャプチャし、それを強制することでDBCC INPUTBUFFER()
仕事をするのいずれかの方法を探しています
+----------------------------+-----------+-----------+------------------------------+
| ErrorMessage | EventType | Parameter | Statement |
+----------------------------+-----------+-----------+------------------------------+
| Incorrect syntax near '.'. | RPC Event | 0 | DbName.dbo.FailedProcedure;1 |
+----------------------------+-----------+-----------+------------------------------+
。
質問がありましたらお知らせください。
あなたは、彼は、上の方法は、スケジュールjob.' – TheGameiswar
@TheGameiswar確かにように動作しなければならない 'で詳しく説明していただけます。私は拡張イベントがバックグラウンドで実行され、指定されたファイルに失敗したクエリ情報を格納することができたことに留意してください。その後、スケジュールに基づいて(毎時間)、そのファイルを読み込み、レコードを 'Logs.Errors'テーブルに挿入することができました。それは今より意味があるのですか? –
拡張イベントの開始と終了のイベントをジョブとして実行する必要はありません。起動すると、バックグラウンドで実行されます。 – TheGameiswar