Ich versuche, eine systemweite Protokollierung zu implementieren, die alle fehlgeschlagenen Stored Procedure Ausführungen in unserer Dabatase protokollieren würde, und ich schaue auf Erweiterte Ereignisse.SQL Server Protokollierung fehlgeschlagener Abfragen
Ich habe einige der Forschung getan und es scheint recht einfach zu Capture-Anweisungen folgenden Code fehlgeschlagen:
--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;
Allerdings Ich mag würde sofort in eine Tabelle fehlgeschlagen Anweisung speichern, nennen wir es Logs.Errors
aber ich konnte keinen Weg finden, dies zu tun, und die obere Methode müsste als geplanter Job funktionieren.
Gerade jetzt, schauen unsere Verfahren wie folgt aus:
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
Wo Logs.LogError
Verfahren ist die Verwendung von DBCC INPUTBUFFER();
macht aber keine Parameter erfassen, nur die genaue Prozedur, die ausgeführt wurde. Das ist alles, was ich von ihm bekommen können:
+----------------------------+-----------+-----------+------------------------------+
| ErrorMessage | EventType | Parameter | Statement |
+----------------------------+-----------+-----------+------------------------------+
| Incorrect syntax near '.'. | RPC Event | 0 | DbName.dbo.FailedProcedure;1 |
+----------------------------+-----------+-----------+------------------------------+
ich nach einer Möglichkeit, entweder zu DBCC INPUTBUFFER()
Arbeit machen, indem sie zwingen ganze Aussage oder XE zu erfassen Aufzeichnungen direkt in eine Tabelle einfügen, wenn das möglich ist.
Haben Sie Fragen - lassen Sie es mich wissen.
Können Sie bitte näher ausführen 'er obere Methode als geplant job.' – TheGameiswar
@TheGameiswar Sicher arbeiten würde. Ich hatte im Hinterkopf, dass Extended Events im Hintergrund ablaufen und Informationen über fehlgeschlagene Abfragen in einer bestimmten Datei speichern könnten. Dann könnte ich basierend auf einem Zeitplan (sagen wir stündlich) diese Datei lesen und Datensätze in die Tabelle "Logs.Errors" einfügen. Macht es jetzt mehr Sinn? –
Youou muss nicht ausgeführt werden erweiterte Ereignisse starten und stoppen Ereignisse als Job, sobald Sie es starten, läuft es im Hintergrund – TheGameiswar