SQL Server-Fehlerprotokollierung und Berichterstellung innerhalb einer gespeicherten Prozedur

Wenn die Anzahl der gespeicherten Prozeduren in einer Datenbank steigt, steigt auch der Verwaltungsaufwand für diese gespeicherten Prozeduren. In einer Produktionsdatenbank werden täglich Tausende von Prozeduren ausgeführt. Sie müssen daher wissen, warum eine gespeicherte Prozedur zu einem bestimmten Zeitpunkt fehlgeschlagen ist. Dies kann durch Implementierung einer Fehlerprotokollierung und Berichterstellung in jeder gespeicherten Prozedur erfolgen.

Sobald ein Problem in einer Produktionsdatenbank aufgetreten ist, müssen Sie es sofort beheben, um den Verlust eines Unternehmens zu verhindern. Um gespeicherte Prozedurfehler zu überwachen und zu beheben, müssen Sie zuerst protokollieren, wenn ein Fehler auftritt, und anschließend die Fehlerberichterstattung überwachen und durchführen.

Lassen Sie uns ein einfaches Verfahren für die Teilungsberechnung erstellen.

CREATE PROCEDURE dbo.MathCalculation (@Dividend INT, @Divisor INT) AS BEGIN SET NOCOUNT ON; BEGIN TRY SELECT @ Dividend / @ Divisor als Quotient; END TRY BEGIN CATCH PRINT Error_message (); END CATCH SET NOCOUNT OFF; ENDE GEHEN

Ich habe eine einfache gespeicherte Prozedur erstellt, um zwei Zahlen zu teilen und ihren Quotienten zu erhalten. Lassen Sie uns sehen, wie es funktioniert, wenn wir eine Division durch 0 durchführen.

EXEC dbo.MathCalculation 100, 2 - Funktioniert perfekt, wobei 50 als Quotient angegeben wird. EXEC dbo.MathCalculation 100, 0 - Division durch den aufgetretenen Nullfehler

Die obige Berechnung schlägt fehl und gibt eine Fehlermeldung in einem Fehlermeldungsfenster aus Division durch Null Fehler aufgetreten.

Sie sehen jetzt Fehler auf dem Bildschirm, aber in einer Produktionsumgebung sind Sie nicht so flexibel. Daher müssen wir die Fehlerprotokollierung implementieren.

Lassen Sie uns eine Tabelle erstellen, um alle Fehler gespeicherter Prozeduren zu protokollieren.

CREATE TABLE [dbo]. [LearningErrorLog] ([ErrorID] [bigint] IDENTITY (1,1) NOT NULL PRIMARY KEY, [Fehlernummer] [nvarchar] (50) NOT NULL, [Fehlerbeschreibung] [nvarchar] (4000) NULL, [ErrorProcedure] [nvarchar] (100) NULL, [ErrorState] [int] NULL, [ErrorSeverity] [int] NULL, [ErrorLine] [int] NULL, [ErrorTime] [datetime] NULL);

Lassen Sie uns eine gespeicherte Prozedur erstellen, um Fehler zu protokollieren.

CREATE PROCEDURE [DBO]. [Learning_Insert_StoredProcedure_ErrorLog] AS SET NOCOUNT ON INSERT INTO [LearningErrorLog] (Fehlernummer, Errordescription, ErrorProcedure, Error, ErrorSeverity, ErrorLine, Errortime) VALUES (ERROR_NUMBER () BEGIN, ERROR_MESSAGE (), ERROR_PROCEDURE (), ERROR_STATE ( ), ERROR_SEVERITY (), ERROR_LINE (), GETDATE ()); NOCOUNT OFF END einstellen

Ich habe in der obigen gespeicherten Prozedur integrierte Fehlerberichtsfunktionen aufgerufen.

FEHLERNUMMER() - gibt die Fehlernummer des Fehlers zurück, durch den der CATCH-Block eines TRY… CATCH-Konstrukts ausgeführt wurde

FEHLERMELDUNG() - gibt den Nachrichtentext des Fehlers zurück, durch den der CATCH-Block eines TRY… CATCH-Konstrukts ausgeführt wurde

ERROR_PROCEDURE () - gibt den Namen der gespeicherten Prozedur oder des Triggers zurück, bei dem ein Fehler aufgetreten ist, durch den der CATCH-Block eines TRY… CATCH-Konstrukts ausgeführt wurde

ERROR_STATE () - gibt die Statusnummer des Fehlers zurück, durch den der CATCH-Block eines TRY… CATCH-Konstrukts ausgeführt wurde

ERROR_SEVERITY () - gibt den Schweregrad des Fehlers zurück, durch den der CATCH-Block eines TRY… CATCH-Konstrukts ausgeführt wurde

VERABREDUNG BEKOMMEN() - gibt den Zeitpunkt des Fehlers zurück, der verursacht wurde

Nun können wir abfragen [LearningErrorLog] Tabelle zur Überwachung des protokollierten Fehlers.

Lassen Sie uns unsere ändern MathCalculation gespeicherte Prozedur und Aufruf [Learning_Insert_StoredProcedure_ErrorLog] innerhalb des catch-Blocks, um eine Fehlerprotokollierung durchzuführen, wenn in der gespeicherten Prozedur ein Fehler aufgetreten ist.

ALTER VERFAHREN dbo.MathCalculation (@Dividend INT, @Divisor INT) ALS BEGINN SET NOCOUNT ON; BEGIN TRY SELECT @ Dividend / @ Divisor als Quotient; END TRY BEGIN CATCH EXEC [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] - Zum Protokollieren von Fehlern gespeicherter Prozeduren END CATCH SET NOCOUNT OFF; ENDE GEHEN

Führen Sie nun erneut das Fehlererzeugungsszenario aus.

EXEC dbo.MathCalculation 100, 0 - Division durch 0 Fehlerszenario 

Fragen Sie die Tabelle [LearningErrorLog] ab. Sie können sehen, dass der Fehler der gespeicherten Prozedur der Catch-Ausnahme in der Tabelle protokolliert wurde.