SQL Server Error Logging och Reporting inom en lagrad procedur

När antalet lagrade procedurer ökar i en databas ökar också bördan för hantering av de lagrade procedurerna. I en produktionsdatabas utförs tusentals procedurer dagligen, så du måste veta varför en lagrad procedur misslyckades vid en viss tidpunkt. Detta kan göras genom att implementera felsökning och rapportering inom varje lagrad procedur.

När en fråga har tagits upp på en produktionsdatabas måste du lösa det omedelbart för att stoppa förlusten för ett företag. För att övervaka och lösa lagrade procedurfel måste du först logga om något fel uppstår och sedan övervaka och utföra felrapportering.

Låt oss skapa ett enkelt förfarande för divisionberäkning.

SKAPA PROCEDURE dbo.MathCalculation (@Dividend INT, @Divisor INT) AS BEGIN SET NOCOUNT ON; BEGIN PRY SELECT @ Utdelning / @ Divisor som Quotient; END TRY BEGIN CATCH PRINT Error_message (); AVSLUTA FÅRSTÄLLNINGSNITT FRÅN; END GO

Jag har skapat ett enkelt lagrat förfarande för att dela upp två tal och få kvoten. Låt oss se hur det fungerar när vi utför delning med 0-drift.

EXEC dbo.MathCalculation 100, 2 - Fungerar perfekt att ge 50 som kvotient EXEC dbo.MathCalculation 100, 0 - Dela upp med nollfel

Ovanstående beräkning misslyckas och skriver ut ett felmeddelande i ett felmeddelandefönster Dela upp med fel på felet.

Nu ser du fel på skärmen, men i en produktionsmiljö får du inte en sådan flexibilitet. Därför måste vi genomföra felsökning.

Låt oss skapa ett bord för att logga alla lagrade procedurfel.

CREATE TABLE [dbo]. [LearningErrorLog] ([ErrorID] [bigint] IDENTITET (1,1) INTE NULL PRIMÄR NYCKEL, [FelNumber] [nvarchar] (50) NULL NULL, [FelDescription] [nvarchar] (4000) NULL, [ErrorProcedure] [nvarchar] (100) NULL, [ErrorState] [int] NULL, [ErrorSeverity] [int] NULL, [ErrorLine] [int] NULL, [ErrorTime] [datetime] NULL);

Låt oss skapa en lagrad procedur för att logga fel.

SKAPA PROCEDURE [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] Så här startar du SET NOCOUNT PÅ INSERT IN [LearningErrorLog] (ErrorNumber, ErrorDescription, ErrorProcedure, ErrorState, ErrorSeverity, ErrorLine, ErrorTime) VÄRDEN (ERROR_NUMBER (), ERROR_MESSAGE (), ERROR_PROCEDURE (), ERROR_STATE ), ERROR_SEVERITY (), ERROR_LINE (), GETDATE ()); Ange NOCOUNT OFF END

Jag har ringt inbyggda felrapporteringsfunktioner i ovanstående lagrade procedur.

ERROR_NUMBER () - returnerar felet för felet som orsakade CATCH-blocket i en TRY ... CATCH-konstruktion som ska köras

FELMEDDELANDE() - returnerar meddelandetexten för det fel som orsakade CATCH-blocket i en TRY ... CATCH-konstruktion som ska köras

ERROR_PROCEDURE () - returnerar namnet på det lagrade förfarandet eller utlösaren där ett fel inträffade som orsakade CATCH-blocket i en TRY ... CATCH-konstruktion som skulle köras

ERROR_STATE () - returnerar tillståndsnumret för felet som orsakade CATCH-blocket i en TRY ... CATCH-konstruktion som ska köras

ERROR_SEVERITY () - returnerar allvaret av felet som orsakade CATCH-blocket i en TRY ... CATCH-konstruktion som ska köras

GetDate () - returnerar tiden för felet som orsakade

Nu kan vi fråga [LearningErrorLog] tabell för att övervaka det loggade felet.

Låt oss ändra vår MathCalculation lagrad procedur och samtal [Learning_Insert_StoredProcedure_ErrorLog] inom fångstblocket för att utföra felloggning om något fel inträffade inom lagrad procedur.

ALTER PROCEDURE dbo.MathCalculation (@Dividend INT, @Divisor INT) AS BEGIN SET NOCOUNT ON; BEGIN PRY SELECT @ Utdelning / @ Divisor som Quotient; END TRY BEGIN CATCH EXEC [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] - För att logga Lagrade procedurfel END AVSLUTA SET NOCOUNT OFF; END GO

Nu, kör igen felgenerationsscenariot.

EXEC dbo.MathCalculation 100, 0 - dividera med 0 fel scenario 

Fråga i tabellen [LearningErrorLog]. Du kan se fältet undantag lagrade procedur fel har loggats i tabellen.