Toute solution industrielle en SQL nécessite une architecture de gestion des erreurs bien pensée. Sans logging et traitement soigné des exceptions, il est impossible de déboguer des processus complexes, en particulier dans les procédures stockées et les scripts de batch.
Historique de la question : Le SQL standard permet une gestion minimale des erreurs (par exemple, RETURN et arrêt du traitement). Les extensions modernes (T-SQL, PL/pgSQL, PL/SQL, etc.) offrent des constructions de gestion des erreurs complètes (TRY/CATCH, EXCEPTION).
Problème : Sans gestion explicite des erreurs, on "coule", et l'administrateur a du mal à établir la cause de l'échec, notamment lors de modifications massives ou d'interactions avec des systèmes externes. Il est souvent nécessaire de journaliser les erreurs dans une table séparée pour une analyse ultérieure.
Solution : Utilisez l'arsenal TRY/CATCH (T-SQL) ou EXCEPTION (PL/pgSQL), ainsi que vos propres tables de logging. N'oubliez pas d'envoyer des informations de diagnostic (code d'erreur, texte de l'erreur, paramètres de la requête et heure) dans le log.
Exemple de code (T-SQL, MS SQL Server) :
CREATE TABLE ErrorLog ( ErrorId INT IDENTITY PRIMARY KEY, ErrorTime DATETIME, ProcedureName NVARCHAR(128), ErrorMessage NVARCHAR(MAX), ErrorNumber INT, ErrorState INT, ErrorSeverity INT ); CREATE PROCEDURE usp_ProcessOrders AS BEGIN BEGIN TRY -- Logique métier UPDATE Orders SET Status = 'PROCESSED' WHERE Status = 'NEW'; END TRY BEGIN CATCH INSERT INTO ErrorLog ( ErrorTime, ProcedureName, ErrorMessage, ErrorNumber, ErrorState, ErrorSeverity ) VALUES ( GETDATE(), ERROR_PROCEDURE(), ERROR_MESSAGE(), ERROR_NUMBER(), ERROR_STATE(), ERROR_SEVERITY() ); THROW; END CATCH END
Exemple de code (PL/pgSQL, PostgreSQL) :
BEGIN -- Votre code EXCEPTION WHEN OTHERS THEN INSERT INTO error_log(ts, proc_name, err_text) VALUES(now(), 'my_proc', SQLERRM); RAISE; END;
Particularités clés :
Est-il suffisant de capturer l'erreur et de terminer l'exécution de la procédure sans transmettre d'informations à l'extérieur ?
Non. Sans logging explicite ou propagation de l'erreur, il est impossible de saisir et d'analyser les causes de l'échec. Il est important soit de détailler l'erreur dans le log, soit au minimum de la faire passer plus loin (THROW/RAISE).
Peut-on se contenter des logs intégrés de SQL Server/DBMS pour identifier toutes les erreurs dans les procédures utilisateur ?
Partiellement. Beaucoup d'erreurs ne se retrouvent pas dans les logs serveur si elles sont "attrapées" et traitées dans l'application ou dans les procédures. Pour la logique métier, il est utile de maintenir son propre log d'événements en détail.
Est-il obligatoire d'utiliser TRY/CATCH (ou EXCEPTION) si seules des opérations DML simples sont utilisées dans la procédure ?
Obligatoire, si la procédure affecte des données importantes, participe à des chaînes critiques et doit enregistrer des situations anormales. Même les opérations "sûres" peuvent générer des erreurs à cause de contraintes extérieures (unicité, FOREIGN KEY, blocages, etc.)
Dans le projet, les erreurs ne sont pas journalisées, seulement affichées à l'utilisateur. En cas de panne massive, l'administrateur passe des heures à chercher un problème "invisible".
Avantages :
Inconvénients :
Toute erreur critique est enregistrée dans une table de log avec des détails (heure, procédure, paramètres, code d'erreur), et y fait référence un ticket du système.
Avantages :
Inconvénients :