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

MS SQL Server Discussion :

Procédure stockée et 'rollback transaction'


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut Procédure stockée et 'rollback transaction'
    Bonjour.
    Je travaille sur SQL Server, en Transact-SQL.

    J'ai une procédure stockée, dans laquelle je fais appel à d'autres procédures stockées ( ou des UDFs ).

    Ma question est la suivante : si je fais un rollback transaction dans la procédure principale, est-ce que les modifications effectuées dans les procédures filles seront également supprimées ( si je ne mets pas de commit transaction dans celles-ci bien sur ) ??

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut
    J'ai également oublié, si jamais je fais un RAISERROR dans une procédure fille, comment faire pour arrêter la procédure mère ?
    J'ai pensé à mettre une variable OUTPUT, de type bit, pour indiquer l'état de sortie, mais y a-t-il un autre moyen ?

  3. #3
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    salut.
    Si la procedure principale englobe ses appels aux procedures filles dans une transaction, alors le rollback annulera les modifications des procedures filles.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE PROC psMere AS
    BEGIN
      BEGIN TRANSACTION XX
        EXEC psFille1
        EXEC psFille2
      IF( @@TRANCOUNT = 1 )
    	ROLLBACK TRANSACTION
    END
    .

    Tu pourras utiliser la valeur de retour de la procedure pour indiquer l'état de l'exécution:
    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
    26
    CREATE PROC psFille1( @prm Int ) AS
    BEGIN
      DECLARE @_retCode Int
      IF ( @prm < 0 ) BEGIN
        SET @_retCode = 1
        GOTO lbl_sortie
      END
     
      SET @_retCode = 0
    lbl_sortie:
      RETURN @_retCode
    END
    GO
     
    CREATE PROC psMere AS
    BEGIN
      DECLARE @r Int
      EXEC @r = psFille1 1000 
      IF ( @r = 0 ) BEGIN /* ici @r = 0 */
    	  EXEC @r = psFille1 -1000 
    	  IF ( @r = 0 ) BEGIN /* ici @r = 1!! donc il n'exécutera pas la suite!!! */
            PRINT 'Ne vas pas s''exécuter!!!'
    	  END
      END
    END
    GO

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut
    Merci pour ta réponse.

    Et concernant un RAISERROR dans une procédure fille ?

  5. #5
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    salut.
    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
    26
    27
    28
    29
    30
    CREATE PROC psFille1( @prm Int ) AS
    BEGIN
      DECLARE @_msg Varchar(4000)
      IF ( @prm < 0 ) BEGIN
        SET @_msg = 'exemple de message d''erreur'
        GOTO lbl_erreur
      END
     
    lbl_sortie:
      RETURN 0
     
    lbl_erreur:
      SET @_msg = IsNull( @_msg, 'Erreur inconnue' )
      RAISERROR( @_msg, 16, 1 )
     
    END 
    GO
     
    CREATE PROC psMere AS
    BEGIN
     
      EXEC psFille1 1000
      IF ( @@ERROR = 0 ) BEGIN /* ici @@ERROR = 0 */
         EXEC psFille1 -1000
         IF ( @@ERROR = 0 ) BEGIN /* ici @@ERROR <> 0!! donc il n'exécutera pas la suite!!! */
            PRINT 'Ne vas pas s''exécuter!!!'
         END
      END
    END 
    GO

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut
    Ok, je ne savais pas qu'on pouvait utiliser la variable @@ERROR dans la procédure mère.
    Par contre, je ne pense pas que je puisse récupérere le RAISERROR dans la procédure mère ( pour modifier le message, par exemple en rajoutant le nom de la procédure mère au message )...

  7. #7
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    salut.
    Dans ce cas utilise la première variante (avec le code retour). Tu codifies les codes retour (exemple : 1>Client inexistant, 2roduit en rupture de stock ...) Sachant le code retour de la procedure fille et sa signification tu pourras formatter le message du RAISERROR dans la procedure mère comme tu veux.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut
    Ce que j'ai finalement fait, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    maProcedureFille ( 
     ... ,
     @returnValue int OUTPUT,
     @messageError varchar(128) OUTPUT 
     
     )
    Comme ca, selon la valeur dans @returnValue, je lève ou non une exception dans la procédure mère. Et ca me permet aussi de bien "spécialiser" mes messages d'erreurs dans les procédures filles.

    En tous cas, merci pour tes réponses.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/03/2008, 10h49
  2. MySQL, ses procédures stockées et les transactions
    Par Shogun dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 11/02/2008, 21h19
  3. Réponses: 2
    Dernier message: 20/03/2006, 09h39
  4. [MySQL5] Procédure Stockée et RollBack
    Par filouxera dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 12/03/2006, 19h12
  5. Transaction et Procédures stockées
    Par Tchinkatchuk dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/06/2005, 19h48

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