Journalisation des erreurs SQL Server et création de rapports au sein d'une procédure stockée

À mesure que le nombre de procédures stockées augmente dans une base de données, la gestion de ces procédures stockées augmente également. Sur une base de données de production, des milliers de procédures sont exécutées quotidiennement. Vous devez donc savoir pourquoi une procédure stockée a échoué à un moment donné. Cela peut être fait en implémentant la consignation des erreurs et la génération de rapports au sein de chaque procédure stockée.

Une fois qu'un problème a été soulevé dans une base de données de production, vous devez le résoudre immédiatement pour empêcher toute perte pour une entreprise. Pour surveiller et résoudre les erreurs de procédure stockée, vous devez d’abord enregistrer une erreur éventuelle, puis surveiller et générer un rapport d’erreur.

Laissez-nous créer une procédure simple pour le calcul de la division.

CREATE PROCEDURE dbo.MathCalculation (@Dividend INT, @Divisor INT) COMME COMMENCER À DÉFINIR NOCOUNT ON; COMMENCEZ ESSAYEZ @ Dividend / @ Divisor as Quotient; END ESSAYER DE COMMENCER IMPRIMER IMPRESSER Error_message (); END CATCH SET NOCOUNT OFF; FIN GO

J'ai créé une procédure stockée simple pour diviser deux nombres et obtenir leur quotient. Voyons comment cela fonctionne lorsque nous effectuons la division par 0.

EXEC dbo.MathCalculation 100, 2 - Fonctionne parfaitement en donnant 50 comme quotient EXEC dbo.MathCalculation 100, 0 - Divise par zéro erreur rencontrée

Le calcul ci-dessus échoue et affiche un message d'erreur dans une fenêtre de message d'erreur Diviser par zéro erreur rencontrée.

Vous voyez maintenant des erreurs à l'écran, mais dans un environnement de production, vous n'obtenez pas une telle flexibilité. Par conséquent, nous devons implémenter la journalisation des erreurs.

Laissez-nous créer une table pour consigner toutes les erreurs de procédure stockée.

CREATE TABLE [dbo]. [LearningErrorLog] ([ErrorID] [bigint] IDENTITY (1,1) NON NULL, TOUCHE PRIMAIRE, [ErrorNumber] [nvarchar] (50) NON NULL, [ErrorDescription] [nvarchar] (4000) NULL, [ErrorProcedure] [nvarchar] (100) NULL, [ErrorState] [int] NULL, [ErrorSeverity] [int] NULL, [ErrorLine] [int] NULL, [ErrorTime] [date / heure] NULL);

Laissez-nous créer une procédure stockée pour enregistrer les erreurs.

CREATE PROCEDURE [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] en tant que BEGIN SET ), ERROR_SEVERITY (), ERROR_LINE (), GETDATE ()); SET NOCOUNT OFF FIN

J'ai appelé les fonctions de rapport d'erreur intégrées dans la procédure stockée ci-dessus.

ERROR_NUMBER () - renvoie le numéro d'erreur de l'erreur qui a entraîné l'exécution du bloc CATCH d'une construction TRY… CATCH

MESSAGE D'ERREUR() - retourne le texte du message d'erreur qui a provoqué l'exécution du bloc CATCH d'une construction TRY… CATCH

ERROR_PROCEDURE () - renvoie le nom de la procédure stockée ou du déclencheur en cas d'erreur entraînant l'exécution du bloc CATCH d'une construction TRY… CATCH

ERROR_STATE () - renvoie le numéro d'état de l'erreur qui a provoqué l'exécution du bloc CATCH d'une construction TRY… CATCH

ERROR_SEVERITY () - renvoie la gravité de l'erreur à l'origine de l'exécution du bloc CATCH d'une construction TRY… CATCH

AVOIR UN RENDEZ-VOUS() - renvoie l'heure de l'erreur qui a causé

Maintenant, nous pouvons interroger [LearningErrorLog] table pour surveiller l'erreur consignée.

Laissez-nous modifier notre Calcul mathématique procédure stockée et appel [Learning_Insert_StoredProcedure_ErrorLog] dans le bloc catch pour effectuer la journalisation des erreurs si une erreur survient dans la procédure stockée.

ALTER PROCEDURE dbo.MathCalculation (@Dividend INT, @Divisor INT) AU DÉBUT DE METTRE NOCOUNT ON; COMMENCEZ ESSAYEZ @ Dividend / @ Divisor as Quotient; END TRY BEGIN CATCH EXEC [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] --Pour enregistrer les erreurs de procédure stockées END CATCH SET NOCOUNT OFF; FIN GO

Maintenant, exécutez à nouveau le scénario de génération d’erreur.

EXEC dbo.MathCalculation 100, 0 - scénario d'erreur diviser par 0 

Interrogez la table [LearningErrorLog]. Vous pouvez voir que l’erreur de procédure stockée d’exception de capture a été enregistrée dans la table.