我試圖實現一個系統範圍內的日誌記錄,它將記錄我們的dabatase中所有失敗的存儲過程執行,並且正在查看擴展事件。SQL Server日誌記錄失敗的查詢
我做了一些研究,它似乎很容易捕獲失敗使用下面的代碼語句:
--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.Errors
但我找不到辦法做到這一點,上面的方法將不得不作爲一個計劃的工作。
眼下,我們的程序看起來像:
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
凡Logs.LogError
過程使得DBCC INPUTBUFFER();
使用,但它並沒有捕捉到的參數,只是在執行的具體程序。這就是我可以從它那裏得到:
+----------------------------+-----------+-----------+------------------------------+
| ErrorMessage | EventType | Parameter | Statement |
+----------------------------+-----------+-----------+------------------------------+
| Incorrect syntax near '.'. | RPC Event | 0 | DbName.dbo.FailedProcedure;1 |
+----------------------------+-----------+-----------+------------------------------+
我正在尋找一種方式,迫使它捕獲整個陳述或XE插入記錄直入一些表,如果可能的話要麼使DBCC INPUTBUFFER()
工作。
任何問題 - 讓我知道。
請你詳細說明'他的上級方法將不得不作爲一個計劃的工作。' – TheGameiswar
@TheGameiswar當然。我記住擴展事件可以在後臺運行並將失敗的查詢信息存儲到給定的文件中。然後根據時間表(我們可以說每小時一次),我可以讀取該文件並將記錄插入Logs.Errors表中。現在它更有意義嗎? –
你不需要運行擴展事件啓動和停止事件作爲作業,一旦你啓動它,它在後臺運行 – TheGameiswar