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 :

Interrompre un script selon des conditions


Sujet :

MS SQL Server

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut Interrompre un script selon des conditions
    Bonjour,
    Nous avons dans le cadre d'une reprise à passer différents script dans un ordre particulier sur deux bases de données. Nous avons donc un document décrivant les étapes du genre.
    Passer Script 1 sur base A
    Passer Script 2 sur base A
    Passer script 3 sur base B
    Faire telle opération
    Lancer script 4 sur base A.

    Je crains les erreurs lors du suivi du mode opératoire, et par exemple que le script 1 soit passé sur la base B. Je voudrais donc blinder mes scripts pour qu'ils partent en erreur et ne s’exécute pas en cas d'erreur de base de données. Le problème est que ces scripts contiennent des GO
    Voici ce que j'ai essayé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET XACT_ABORT ON;
    if db_name() not like 'CNET%' 
    begin
    raiserror('Ce script ne doit pas être joué sur cette base de données',16,1)	
     
    end
    GO
    select 'Je ne dois pas voir ce message'
    GO
    Voilà ce que j'obtiens
    Msg 50000, Level 16, State 1, Line 4
    Ce script ne doit pas être joué sur cette base de données

    Je ne dois pas voir ce message

    (1 row(s) affected)
    Deuxième essai
    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
     
    if db_name() not like 'CNET%' 
    begin
    	GOTO ErreurBD
     
    end
    --GO
    select 'Je ne dois pas voir ce message'
    --GO
     
    GOTO fin
    ErreurBD:
    raiserror('Ce script ne doit pas être joué sur cette base de données',16,1)	
     
    fin:
    Qui donne bien le résultat attendu tant que je ne décommente pas les GO.
    Y-a t-il une solution à mon problème, sachant que je ne suis pas sure de pouvoir supprimer tous les GO.
    Merci de votre aide
    Soazig

  2. #2
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET XACT_ABORT ON;
    IF db_name() NOT LIKE 'CNET%' 
    begin
    raiserror('Ce script ne doit pas être joué sur cette base de données',18,1)	
     
    end
    GO
    SELECT 'Je ne dois pas voir ce message'
    GO
    ou au pire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SET XACT_ABORT ON;
    IF db_name() NOT LIKE 'CNET%' 
    begin
    raiserror('Ce script ne doit pas être joué sur cette base de données',18,1)	
     
    end
    Else
    Begin
     
    SELECT 'Je ne dois pas voir ce message'
     
    end

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Pour la première requête,j'ai le même résultat qu'avec un niveau 16.
    Pour la deuxième
    Msg 102, Level 15, State 1, Line 8
    Syntaxe incorrecte vers 'Begin'.

    Je ne dois pas voir ce message

    (1 row(s) affected)

    Msg 102, Level 15, State 1, Line 1
    Syntaxe incorrecte vers 'end'.
    C'est normal, après un GO c'est comme si on commençait un nouveau script.
    S'il y a d'autres propositions je prends.
    Merci
    Soazig

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Une solution serait de mettre le script dans un EXEC, lequel serait conditionné par le test de db_name().
    Le problème c'est que cela peut être assez fastidieux, car il faut souvent modifier le script pour cela (par exemple, doubler les guillemets,...)

    Une alternative : apparemment, le but est d’empêcher que le script ne soit exécuté sur la mauvaise base suite à une erreur de manip. Il semble donc que ces scripts seront exécutés à la main, par exemple dans SSMS ?

    Dans ce cas peut-être pourriez vous ajouter ceci en début de script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WHILE(db_name() not like 'CNET%')
    BEGIN
    	raiserror('Ce script ne doit pas être joué sur cette base de données, veuillez annuler l''exécution du script et sélectionner la bonne base',16,1) WITH NOWAIT
    	SELECT 'Veuillez regarder les message d''erreur' --> car sinon l'opérateur, qui déjà ne sait pas sélectionner la bonne base, va attendre pendant des heures la fin de l’exécution du script :)
    	waitfor delay '01:00:00'
    end
    L'idée est donc une boucle sans fin si le script n'est lancé sur la bonne base... pas très subtil, mais efficace

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    La solution de aieeeuuuuu fonctionne très bien, et si personne ne me suggère autre chose d'ici demain, elle sera adoptée.
    Mais si vous avez plus élégant comme solution je prends.
    Cordialement
    Soazig

  6. #6
    Invité
    Invité(e)
    Par défaut
    Et avec un bon vieux GOTO des familles ?

    http://msdn.microsoft.com/fr-fr/library/ms180188.aspx

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    7gyY9w1ZY6ySRgPeaefZ si tu regardes mon deuxième exemple, tu verras que lorsqu'il y a des GO les GOTO ne fonctionne pas.

    Soazig

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    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 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Il faut effectivement passer par du SQL dynamique.

    A +

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par soazig Voir le message
    Bonjour,
    7gyY9w1ZY6ySRgPeaefZ si tu regardes mon deuxième exemple, tu verras que lorsqu'il y a des GO les GOTO ne fonctionne pas.
    Soazig
    Désolé, j'ai lu trop vite...

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Comment seront lancés les scripts ?

    Une autre solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    :on error exit
     
    if (db_name() not like 'test') 
    begin
    	raiserror('Ce script ne doit pas être joué sur cette base de données',16,1) WITH NOWAIT;
    end
     
    GO
    ...
    Mais cela oblige à être en mode SQLCMD.

    Sinon, le mieux serait justement de faire un script sqlcmd qui gère l'ensemble des scripts SQL. Comme ça plus d'erreur de manip...

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Rebonjour,
    Les scripts seront lancé dans SSMS (sql server Management Studio).
    J'avais précisé cela lorsque j'ai posté la première fois, mais mon temps de rédaction était trop long, j'ai perdu mon post.
    Merci
    Soazig

  12. #12
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Sinon utiliser un petit programme .net avec SMO qui passe les script un par un (il gère nativement le découpage des GO)

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Après discussion avec mes collègues la solution proposée par aieeeuuuuu avec le while est adoptée.
    Merci à tous
    Soazig

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

Discussions similaires

  1. [XL-2003] insertion d'image selon des conditions
    Par Vincent91 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 30/06/2011, 17h57
  2. afficher des ecrans selon des conditions
    Par chamssou dans le forum SAP
    Réponses: 5
    Dernier message: 24/03/2011, 13h54
  3. afficher des ecrans selon des conditions
    Par chamssou dans le forum SAP
    Réponses: 1
    Dernier message: 24/03/2011, 12h35
  4. Réponses: 13
    Dernier message: 22/07/2009, 14h36
  5. [SQL Server 8] fonction Max --- selon des conditions
    Par Baquardie dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/01/2006, 21h06

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