Paramétrage des constantes SEVERITY et STATE dans RAISERROR et gestion des messages d’erreurs de SQL Server

Voici quelques informations sur le paramétrage de SEVERITY et STATE pour le commande RAISERROR

==> Constante SEVERITY (plage de 0 à 25)…

PAS D’ERREUR

0 et 10 – ne constitue pas une erreur, mais un simple message d’information.
L’utilisation de la commande PRINT produit un message de niveau 0 dont seul le texte est affiché. Ce type de message n’alimente pas la variable @@ERROR qui reste à zéro.
Pour les messages de niveau 10, SQL Server les transforme en sévérité 0
Exemple :
RAISERROR(‘Vous avez un message’, 0, 1);
RAISERROR(‘Vous avez un message de niveau 10′, 10, 1);

WARNING (message d’information)

1 – informations système diverses
2 à 6 – réservées à des messages d’information
7 – notification : information d’état
8 – notification : intervention de l’utilisateur requise
9 – message d’information défini par l’utilisateur

Exemple :

DECLARE @SCH sysname;
SET @SCH = SCHEMA_NAME();
RAISERROR('En l''absence de préfixe de schéma, l''objet a été récupéré dans %s', 9, 1, @SCH);

ERREURS de programmation

11 – l’objet spécifié n’a pas été trouvé dans la base
12 – inutilisé
13 – Erreur de syntaxe de la transaction utilisateur
14 – Privilèges insuffisant
15 – Erreur de syntaxe dans une commande SQL
16 – Erreur utilisateur

Mais il est curieux de savoir que ces classes ne sont pas tout à fait étanches. Par exemple une classe 13 est levée en cas de verrous mortel (deadlock) alors que le pauvre développeur n’a pas commis de faute de syntaxe !

EXEMPLE :
RAISERROR('La Table %s n'existe pas dans le schéma %s', 16, 1, 'Client', 'dbo');

ERREURS fatales

Ces erreurs sont liées à des problèmes de ressources, d’endommagement de fichier, des erreur du système ou la panne du hardware. Plus la sévérité est élevée, plus l’erreur est sérieuse.

17 – Ressources insuffisantes
18 – erreur interne récupérable
19 – erreur irrécupérable de ressource
20 – erreur irrécupérable du traitement en cours
21 – erreur irrécupérable dans les traitements de base de données
22 – erreur fatale : intégrité douteuse de la table
23 – erreur fatale : intégrité douteuse de la base de données
24 – erreur fatale : ereur matérielle
25 – erreur fatale

Exemple :
RAISERROR('Commande illégale... Par conséquent, coupure de connexion!', 20, 1) WITH LOG;

Msg 2745, Niveau 16, État 2, Ligne 1
Le processus ID 54 a provoqué l’erreur utilisateur 50000, gravité 20. SQL Server termine ce processus.
Msg 2745, Niveau 16, État 2, Ligne 1
Le processus ID 52 a provoqué l’erreur utilisateur 50000, gravité 20. SQL Server termine ce processus.
Msg 50000, Niveau 20, État 1, Ligne 1
Commande illégale… Par conséquent, coupure de connexion!
Msg 0, Niveau 20, État 0, Ligne 0
Une erreur grave s’est produite sur la commande actuelle. Les résultats éventuels doivent être ignorés.

NOTA :

  • vous n’êtes pas autorisé à utiliser les niveaux d’erreur au dela de 18 si vous n’avez pas les privilèges adéquats et la syntaxe étendue (être membre du rôle de serveur sysadmin et ajouter WITH LOG au RAISERROR)
  • Les erreurs de 20 à 25 mettent fin à la connexion de l’utilisateur

==> STATE

est une valeur purement cosmétique et n’est pas géré par SQL Server. Sa valeur est limitée à la plage 0 à 255. Toute autre valeur génèrent une erreur.

On peut l’utiliser de la manière suivante : « si une même erreur définie par l’utilisateur est générée à plusieurs emplacements, l’utilisation d’un numéro d’état unique pour chaque emplacement peut vous aider à trouver la portion de code à l’origine des erreurs. » (extrait de la doc en ligne de MS SQL Server)

==> CONCLUSIONS

Les développeurs ne devraient jamais utiliser que les niveaux de sévérité 0, 9 et 16 et jouer sur l’état si besoin est…


--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence  * * * * *

MVP Microsoft SQL Server

Laisser un commentaire