Quel est un bon moyen de rendre les proc stockés suffisamment robustes pour qu'ils puissent très bien évoluer et contenir également la gestion des erreurs?
De plus, quelle est la meilleure façon de gérer plusieurs scénarios d'erreur dans un processus stocké et d'avoir un système de rétroaction intelligent qui retournera des informations d'erreur significatives aux applications appelantes?
Réponses:
Alex Kuznetsov a un grand chapitre dans son livre Defensive Database Programming (Chapter 8) qui couvre T-SQL TRY ... CATCH, les transactions T-SQL & SET XACT_ABORT et l'utilisation de la gestion des erreurs côté client. Cela vous aidera beaucoup à décider laquelle des options est la plus logique pour ce que vous devez accomplir.
Il est disponible gratuitement sur ce site . Je ne suis en aucun cas affilié à la société, mais je possède la version papier de ce livre.
Il y a beaucoup de petits détails sur ce sujet qui sont très bien expliqués par Alex.
Selon la demande de Nick ... (mais tout cela n'est pas dans le chapitre)
En termes de mise à l'échelle, vous devez être brutalement honnête sur les activités qui doivent être dans le code db et celles qui doivent être dans l'application. Avez-vous déjà remarqué à quel point le code à exécution rapide a tendance à revenir à la conception pour une seule préoccupation par méthode?
Le moyen le plus simple de communiquer serait des codes d'erreur personnalisés (> 50 000). C'est aussi assez rapide. Cela signifie que vous devez synchroniser le code DB et le code d'application. Avec un code d'erreur personnalisé, vous pouvez également renvoyer des informations utiles dans la chaîne de message d'erreur. Parce que vous avez un code d'erreur strictement pour cette situation, vous pouvez écrire un analyseur dans le code d'application adapté au format de données de l'erreur.
De plus, quelles conditions d'erreur nécessitent une logique de nouvelle tentative dans la base de données? Si vous souhaitez réessayer après X secondes, vous feriez mieux de gérer cela dans le code de l'application afin que la transaction ne bloque pas autant. Si vous ne soumettez à nouveau qu'une opération DML immédiatement, la répéter dans le SP pourrait être plus efficace. Gardez à l'esprit, cependant, que vous devrez éventuellement dupliquer du code ou ajouter une couche de SP pour effectuer une nouvelle tentative.
Vraiment, c'est actuellement le plus gros problème avec la logique TRY ... CATCH dans SQL Server pour le moment. Cela peut être fait, mais c'est un peu un oaf. Recherchez certaines améliorations à venir dans SQL Server 2012, en particulier la relance des exceptions système (en conservant le numéro d'erreur d'origine). En outre, il existe FORMATMESSAGE , qui ajoute une certaine flexibilité dans la création de messages d'erreur, en particulier à des fins de journalisation.
la source
Ceci est notre modèle (enregistrement des erreurs supprimé)
Remarques:
... alors ne créez pas plus de TXN que vous n'en avez besoin
cependant,
la source
J'utilise Try / Catch, mais je recueille aussi autant d'informations que possible et je les écris dans un journal d'erreurs APRÈS la restauration. Dans cet exemple, "LogEvent" est une procédure stockée qui écrit dans une table EventLog, contenant les détails de ce qui s'est passé. GetErrorInfo () est un appel de fonction qui renvoie le message d'erreur exact.
Lorsqu'une erreur se produit, les informations sont collectées, la procédure passe à la section de gestion des erreurs et effectue une restauration. Les informations sont écrites dans le journal, puis la procédure se termine.
Compte tenu des appels de procédure / fonction supplémentaires impliqués, cela semble un peu exagéré. TOUTEFOIS, cette méthode est extrêmement utile lorsque vous essayez de déboguer le problème.
la source