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.