我试图实现一个系统范围内的日志记录,它将记录我们的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