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 :

Trigger qui rollback, mais pas complètement


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut Trigger qui rollback, mais pas complètement
    Bonjour,

    J'ai une table (TBL_SERVICE) avec une clef PK_SERVICE auto-incrémentée. Quand je fais un insert, mon trigger vérifie la clef entrée par rapport à la référence, et si c'est bon, incrémente la valeur référence. Le problème, c'est que dans mon trigger, j'ai bien le message d'erreur (50201), l'insertion n'a effectivement pas lieu, mais il incrémente quand même la clef (alors qu'il ne devrait pas aller au delà du rollback)


    la table service
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Create table [TBL_SERVICE]
    (
        [PK_SERVICE] Integer NOT NULL, UNIQUE ([PK_SERVICE]),
        [VCH_SERVICE] Varchar(64) NOT NULL, UNIQUE ([VCH_SERVICE])
    ) 
    go
    la table qui sert de référence (la valeur dont j'ai besoin est dans NUM_CLEF)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Create table [TBL_CLEF]
    (
        [PK_CLEF] Integer NOT NULL, UNIQUE ([PK_CLEF]),
        [VCH_CLEF] Varchar(64) NOT NULL, UNIQUE ([VCH_CLEF]),
        [NUM_CLEF] Integer Default 0 NOT NULL
    ) 
    go
    Et le trigger en question
    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
    create trigger TRG_SERVICE_INS on TBL_SERVICE for insert as
    begin    /* véification de la valeur de la clef */
        if(    (select INSERTED.PK_SERVICE 
            from INSERTED) <> (1 + (    select TBL_CLEF.NUM_CLEF
                                from TBL_CLEF
                                where TBL_CLEF.VCH_CLEF='ID_SERVICE')))
        begin /* si elle est fausse, on lance l'erreur */
            raiserror(50201, 16, 1)
            ROLLBACK TRANSACTION
        end
     
        /* mise à  jour de la table des clefs */
        UPDATE TBL_CLEF
        set TBL_CLEF.NUM_CLEF = TBL_CLEF.NUM_CLEF + 1
        where TBL_CLEF.VCH_CLEF='ID_SERVICE'
     
    end
    go
    Est-ce moi qui m'y prend mal, ou est-ce que le code apres le rollback est quand même executé ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Par défaut
    Oui, le code après le ROLLBACK est qd même exécuté ...

    Il faut que tu fasses explicitement un RETURN après ROLLBACK TRAN

  3. #3
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    ha ok ! C'est byzarre, dans une doc que j'ai (format papier, et pas de scanner sous la main), il y a un shema qui explique qu'à un ROLLBACK TRANSACTION, il y a une sortie directe qui annule tout et s'arrête là.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Par défaut
    C'est également ce qui est indiqué dans la doc de SQL Server :



    L'exécution d'une instruction ROLLBACK TRANSACTION dans un déclencheur entraîne les conséquences suivantes :
    • toutes les modifications de données effectuées jusque là dans la transaction en cours sont annulées, y compris celles effectuées par le déclencheur ;
    • le déclencheur termine l'exécution des instructions postérieures à l'instruction ROLLBACK. Si l'une de ces instructions modifie les données, les modifications ne sont pas annulées. Aucun déclencheur imbriqué ne peut être activé par l'exécution de ces instructions ;
    • aucune instruction du lot suivant celle qui a activé le déclencheur n'est exécutée.
    C'est peut-être une question de paramétrage du serveur; en tout cas, l'expérience m'a montré que le ROLLBACK TRAN ne me sortait pas du trigger ...

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

Discussions similaires

  1. [SQL2K] recopier une ligne, mais pas complètement
    Par Monstros Velu dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/10/2006, 12h54
  2. [FLASH 8] : FLA qui fonctionne mais pas le SWF
    Par xtaze dans le forum Flash
    Réponses: 9
    Dernier message: 24/10/2006, 09h14
  3. Code qui marche, mais pas la mise à jour
    Par Cablan dans le forum Access
    Réponses: 7
    Dernier message: 24/10/2005, 17h09
  4. Script qui marche mais pas elegant[newbie]
    Par billybob2006 dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2005, 12h25
  5. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 22h21

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