IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[T-SQL] Erreur non "catchée" dans une transaction


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut [T-SQL] Erreur non "catchée" dans une transaction
    Salut,

    j'ai une procédure stockée toute bête dans laquelle j'essaye de faire une gestion d'erreur basique mais je n'arrive pas à "catcher" l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    CREATE PROCEDURE [dbo].[sps_DeleteI18N] 
    	@I18N varchar(255)
    AS
    BEGIN
     
    	BEGIN TRANSACTION
     
    		DELETE FROM [DICTIONNAIRE_PAGE] WHERE [I18N] = @I18N
     
    		DELETE FROM [DICTIONNAIRE] WHERE [I18N] = @I18N
     
     
    	IF @@ERROR <> 0
    	BEGIN
       		ROLLBACK TRANSACTION
    		PRINT 'ROLLBACK ! '
    		PRINT CAST(@@ERROR AS VARCHAR(10));
    	END
    	ELSE
    	BEGIN
    		COMMIT TRANSACTION
    		PRINT 'OK';
    	END
     
    END
    La table DICTIONNAIRE contient un champ clé étrangère de DICTIONNAIRE_PAGE, donc il faut supprimer en 1er dans DICTIONNAIRE.

    J'ai volontairement inversé le bon ordre des 2 DELETE pour provoquer l'erreur afin de vérifier le code.
    Je m'attends à ce que le rollback soit fait et en fait je passe dans le commit ! (avec le 2e DELETE qui s'exécute correctement)

    Msg*547, Niveau*16, État*0, Procédure*sps_DeleteI18N, Ligne*18
    L'instruction DELETE est en conflit avec la contrainte REFERENCE "FK_DICTIONNAIRE_DICTIONNAIRE_PAGE". Le conflit s'est produit dans la base de données "PARAD", table "dbo.DICTIONNAIRE", column 'I18N'.
    L'instruction a été arrêtée.

    (3*ligne(s) affectée(s))
    OK

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    C'est normal, @@ERROR est réinitialisé à 0 à chaque ordre SQL. Si l'erreur survient au 1er delete, lors du 2e delete, si ce dernier passe bien @@ERROR vaut zéro et vous ne voyez rien venir...sœur Âne !

    Voici donc une approche plus costaude...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    CREATE PROCEDURE [dbo].[sps_DeleteI18N] 
    	@I18N varchar(255)
    AS
    BEGIN
     
    	BEGIN TRANSACTION
     
    		DELETE FROM [DICTIONNAIRE_PAGE] WHERE [I18N] = @I18N;
    		IF @@ERROR <> 0 GOTO LBL_ERROR;
     
    		DELETE FROM [DICTIONNAIRE] WHERE [I18N] = @I18N
            IF @@ERROR <> 0 GOTO LBL_ERROR;
     
        COMMIT TRANSACTION
        PRINT 'OK';
        RETURN
     
    LBL_ERROR:
    	ROLLBACK TRANSACTION
    	PRINT 'ROLLBACK ! '
    	PRINT CAST(@@ERROR AS VARCHAR(10));
     
    END
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 410
    Points : 147
    Points
    147
    Par défaut
    Ah ok, je comprends, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Requête sql avec méthode DoCmd.Runsql bloqué dans une transaction
    Par rana dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/03/2010, 13h20
  2. Réponses: 1
    Dernier message: 08/08/2007, 11h26
  3. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo