Errore di SQL Server che registra e segnala all'interno di una stored procedure

Con l'aumentare del numero di procedure memorizzate in un database, aumenta anche l'onere della gestione di tali stored procedure. Su un database di produzione, vengono eseguite giornalmente migliaia di procedure, pertanto è necessario conoscere il motivo per cui una stored procedure non è riuscita in un determinato momento. Questo può essere fatto implementando la registrazione degli errori e la segnalazione all'interno di ciascuna stored procedure.

Una volta che un problema è stato sollevato su un database di produzione, è necessario risolverlo immediatamente per fermare la perdita di un'azienda. Per monitorare e risolvere gli errori di stored procedure, è necessario prima registrare se si verificano errori e quindi monitorare ed eseguire la segnalazione degli errori.

Cerchiamo di creare una semplice procedura per il calcolo della divisione.

CREATE PROCEDURE dbo.MathCalculation (@Dividend INT, @Divisor INT) AS BEGIN SET NOCOUNT ON; INIZIA PROVA SELECT @ Dividendo / @ Divisore come quoziente; FINE PROVA INIZIA A CATCH PRINT Error_message (); FINE DELLA CATENA SET NOCOUNT OFF; FINE ANDARE

Ho creato una semplice procedura memorizzata per dividere due numeri e ottenere il loro quoziente. Vediamo come funziona quando eseguiamo l'operazione divide per 0.

EXEC dbo.MathCalculation 100, 2 - Funziona perfettamente dando 50 come quoziente EXEC dbo.MathCalculation 100, 0 - Divide per errore zero rilevato

Il calcolo precedente non riesce e stampa un messaggio di errore in una finestra di messaggio di errore Dividere per errore zero rilevato.

Ora vedi degli errori sullo schermo, ma in un ambiente di produzione non ottieni tale flessibilità. Pertanto, dobbiamo implementare la registrazione degli errori.

Cerchiamo di creare una tabella per registrare tutti gli errori di stored procedure.

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

Cerchiamo di creare una stored procedure per registrare gli errori.

CREATE PROCEDURE [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] AS BEGIN SET NOCOUNT ON INSERT IN [LearningErrorLog] (ErrorNumber, ErrorDescription, ErrorProcedure, ErrorState, ErrorSeverity, ErrorLine, ErrorTime) VALUES (ERROR_NUMBER (), ERROR_MESSAGE (), ERROR_PROCEDURE (), ERROR_STATE ( ), ERROR_SEVERITY (), ERROR_LINE (), GETDATE ()); SET NOCOUNT OFF END

Ho chiamato funzioni di segnalazione degli errori incorporate nella procedura memorizzata sopra.

ERROR_NUMBER () - restituisce il numero di errore dell'errore che ha causato l'esecuzione del blocco CATCH di un costrutto TRY ... CATCH

MESSAGGIO DI ERRORE() - restituisce il testo del messaggio dell'errore che ha causato l'esecuzione del blocco CATCH di un costrutto TRY ... CATCH

ERROR_PROCEDURE () - restituisce il nome della stored procedure o trigger in cui si è verificato un errore che ha causato l'esecuzione del blocco CATCH di un costrutto TRY ... CATCH

ERROR_STATE () - restituisce il numero di stato dell'errore che ha causato l'esecuzione del blocco CATCH di un costrutto TRY ... CATCH

ERROR_SEVERITY () - restituisce la gravità dell'errore che ha causato l'esecuzione del blocco CATCH di un costrutto TRY ... CATCH

GETDATE () - restituisce l'ora dell'errore che ha causato

Ora possiamo interrogare [LearningErrorLog] tabella per monitorare l'errore registrato.

Cerchiamo di modificare il nostro MathCalculation stored procedure e chiamate [Learning_Insert_StoredProcedure_ErrorLog] nel blocco catch per eseguire la registrazione degli errori in caso di errore durante la procedura memorizzata.

ALTER PROCEDURE dbo.MathCalculation (@Dividend INT, @Divisor INT) AS BEGIN SET NOCOUNT ON; INIZIA PROVA SELECT @ Dividendo / @ Divisore come quoziente; FINE PROVA INIZIA CATCH EXEC [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] --Per log Errori di stored procedure END CATCH SET NOCOUNT OFF; FINE ANDARE

Ora, esegui nuovamente lo scenario di generazione degli errori.

EXEC dbo.MathCalculation 100, 0 - divide per 0 scenario di errore 

Interrogare la tabella [LearningErrorLog]. È possibile visualizzare l'errore di procedura memorizzata delle eccezioni memorizzate nella tabella.