Gestion des erreurs dans les procédures stockées distantes de serveur à serveur

Vous pouvez rencontrer des erreurs relatives à des instructions et à des traitements si vous exécutez des procédures stockées distantes et des traitements sur un client à partir d'une instance locale de SQL Server. Il est à savoir que :

  • si une erreur d'annulation d'exécution d'instruction se produit, l'instruction ayant provoqué l'erreur est interrompue mais l'exécution de la procédure stockée distante ou du traitement continue ;

  • si l'erreur qui se produit est provoquée par un traitement, l'exécution de la procédure stockée distante tout entière ou du traitement entier est interrompue ;

  • si des procédures stockées distantes et des traitements sont exécutés dans le cadre d'un bloc TRY, les erreurs d'annulation de lot peuvent être gérées par la construction TRY…CATCH.

Le comportement des procédures stockées et des lots découlant d'erreurs relatives à des instructions et des traitements est régi par le paramètre SET XACT_ABORT du serveur local.

SET XACT_ABORT est défini sur OFF

Si le paramètre SET XACT_ABORT est défini sur OFF (c'est-à-dire qu'il est désactivé) sur le serveur local, toutes les erreurs d'annulation d'instruction de la procédure stockée distante sont transférées en tant que telles au client par le serveur local. Seule l'instruction à l'origine de l'erreur est interrompue. Le client reçoit les messages d'erreur correspondant aux erreurs d'annulation d'instruction. En outre, si la procédure stockée distante s'exécute jusqu'à son terme, la variable @@ERROR renvoie la valeur 0. Si l'erreur se produit dans le cadre d'un bloc TRY, l'exécution continue et le bloc CATCH n'est pas appelé.

Les erreurs d'annulation de traitement dans la procédure stockée distante sont transmises au client par le serveur local. L'instruction EXECUTE ayant appelé la procédure stockée distante est interrompue, mais le traitement ou la procédure stockée qui contient l'instruction EXECUTE continue son exécution. Ainsi, la variable @@ERROR renvoie le code de l'erreur ayant interrompu la procédure stockée distante et la valeur renvoyée de la procédure correspond à NULL. Si la procédure stockée distante qui provoque l'erreur s'exécute dans le cadre d'un bloc TRY sur le serveur local, l'erreur entraîne le transfert du contrôle au bloc CATCH avec les informations relatives à la dernière erreur commise sur le serveur distant.

Lorsque vous corrigez les erreurs, exécutez une procédure stockée distante depuis le bloc TRY d'une construction TRY…CATCH. En effet, si la procédure stockée distante ne s'est pas terminée correctement, son exécution passe au bloc CATCH associé sur le serveur local en y transférant les informations relatives à la dernière erreur sur le serveur distant. Si la procédure stockée distante s'est terminée correctement, l'exécution suit son cours dans le bloc TRY sur le serveur local et la valeur renvoyée de la procédure stockée distante peut être utilisée.

D'une autre manière, lors de l'exécution d'une procédure stockée distante en dehors du cadre d'un bloc TRY, examinez @@ERROR à la fin de la procédure stockée distante pour vérifier si cette dernière s'est correctement achevée. Si @@ERROR vaut 0, la procédure stockée s'est déroulée correctement et la valeur renvoyée de la procédure stockée peut être utilisée. Si @@ERROR ne vaut pas 0, la procédure stockée a rencontré un problème lors de son exécution et la valeur renvoyée de la procédure stockée ne peut pas être utilisée.

SET XACT_ABORT est défini sur ON

Si le paramètre SET XACT_ABORT est défini sur ON (c'est-à-dire qu'il est activé) au niveau du serveur local, il est transmis au serveur lié. Toutes les erreurs provoquées par des annulations d'instructions ou de traitements dans la procédure stockée distante sont alors converties en erreurs d'annulation de lots sur le serveur local. Ainsi, l'exécution du traitement ou de la procédure stockée ayant appelé la procédure stockée distante est interrompue en même temps que la procédure stockée. Lorsque la procédure stockée distante qui provoque l'erreur s'exécute dans le cadre d'un bloc TRY sur le serveur local, l'erreur entraîne le transfert du contrôle au bloc CATCH avec les informations relatives à la dernière erreur commise sur le serveur distant.

Si une procédure stockée distante est exécutée hors du cadre d'un bloc TRY, vous ne pouvez pas analyser la valeur de @@ERROR pour déterminer qu'une erreur de traitement s'est produite car l'instruction suivant l'instruction EXECUTE ne s'exécute pas. Vous devez par conséquent exécuter une procédure stockée distante depuis le bloc TRY d'une construction TRY…CATCH. Si la procédure stockée ne s'est pas terminée correctement, son exécution passe au bloc CATCH sur le serveur local avec les informations relatives à la dernière erreur commise sur le serveur distant. Si la procédure stockée est exécutée sans problème, l'exécution suit son cours dans le bloc TRY sur le serveur local et la valeur renvoyée de la procédure stockée peut être utilisée.

RAISERROR et TRY…CATCH

L'appel de RAISERROR avec une gravité inférieure à 20 depuis une procédure stockée distante provoque une erreur d'annulation d'instruction sur le serveur distant. Une construction TRY…CATCH sur le serveur local ne peut gérer que les erreurs d'annulation de traitements distants. Si une procédure stockée distante appelle RAISERROR avec une gravité inférieure à 20 tout en faisant partie d'un bloc TRY sur le serveur local, RAISERROR n'entraîne pas le transfert du contrôle au bloc CATCH de la construction TRY…CATCH. Cependant, si la gravité est supérieure ou égale à 20 sur le serveur distant, RAISERROR perd la connexion et l'exécution sur le serveur local passe donc au bloc CATCH.