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

Administration SQL Server Discussion :

Script de sauvegardes


Sujet :

Administration SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut Script de sauvegardes
    Bonjour,

    j'essaie de sauvegarder les bases de données hébergées par un serveur SQL Server 2008 (SP3) vers un espace de stockage situé sur un serveur Windows 2012 distant.

    J'ai récupéré des scripts sur différents sites et j'ai finalement ce script:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    DECLARE @name VARCHAR(50) -- database name  
    DECLARE @path VARCHAR(256) -- path for backup files  
    DECLARE @fileName VARCHAR(256) -- filename for backup  
    DECLARE @fileDate VARCHAR(20) -- used for file name
     
     
    -- specify database backup directory
    SET @path = '\\serveurdistant\backupdir'  
     
     
    -- specify filename format
    SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 
     
     
    -- delete backups older than 6 days
    EXEC xp_cmdshell 'FORFILES /p 'N:' /s /m *.bak /d -6 /c "CMD /C del /Q /F @FILE"'
     
    DECLARE db_cursor CURSOR FOR  
    SELECT name 
    FROM master.dbo.sysdatabases 
    WHERE name NOT IN ('model','tempdb')  -- exclude these databases
     
     
    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @name   
     
     
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
           SET @fileName = @path + '_' + @name + '_' + @fileDate + '.BAK'  
           PRINT 'BACKUP DATABASE @name TO DISK = [' + @filename + ']'  
     
     
           FETCH NEXT FROM db_cursor INTO @name   
    END   
     
     
    CLOSE db_cursor   
    DEALLOCATE db_cursor




    ( Au départ j'avais des problèmes de droits d'accès au répertoire distant que j'ai réglé en mettant l'administrateur du domaine pour le lancement de SQL Server.
    Puis avec le @filename que j'ai remplacé par [' + @filename + ']'... Ça marche mais je ne comprends rien à cette syntaxe... )
    J'utilise maintenant N: au lieu du nom UNC car FORFILES me rendait une erreur comme quoi il ne gère pas les chemins UNC.
    J'ai un problème du même genre maintenant et j'obtiens ce message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Syntaxe incorrecte vers ' /s /m *.bak /d -6 /c "CMD /C del /Q /F @FILE"'


    J'enlève, j'ajoute des ', des ", des [ etc. mais rien n'y fait... Merci pour votre aide!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Le problème semble se situer dans cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC xp_cmdshell 'FORFILES /p 'N:' /s /m *.bak /d -6 /c "CMD /C del /Q /F @FILE"'
    Et plus précisément derrière N:.
    Je ne connais pas la commande que tu cherches à exécuter mais il y a de fortes chances que celle-ci attende que N: soit encadré de guillemets, ce qui n'est pas le cas ici puisque lesdits guillemets sont utilisés pour encadrer la commande...
    Essaye peu-être en échappant les guillemets autour du N: :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC xp_cmdshell 'FORFILES /p \'N:\' /s /m *.bak /d -6 /c "CMD /C del /Q /F @FILE"'
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Merci pour ton aide.
    Avec ta modification, j'ai le même genre d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Syntaxe incorrecte vers '\'.
    Je cherche à supprimer les anciens fichiers de sauvegarde. Mais il y a peut-être plus simple? Un argument dans BACKUP etc.

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Si j'enlève les guillemets autour de N: alors le message d'erreur est que le chemin spécifié n'existe pas.
    Si (toujours sans les guillemets) je remplace N par un lecteur local alors ça fonctionne...

    Je ne peux ni utiliser de chemin UNC, ni de lettre de lecteur réseaux? Sans ça, je ne vois pas comment faire pour atteindre le répertoire distant...

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Je me suis débrouillé avec un "WITH INIT" en argument de BACKUP.
    Je laisse ouvert au cas où quelqu'un peut expliquer pour la solution avec FORFILES.

    Merci!

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    En fait ça ne marche pas...
    Toujours les problèmes de guillemets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      PRINT 'BACKUP DATABASE [' + @name + '] TO DISK = [' + @filename + ']
    		WITH NOFORMAT, INIT, SKIP, NOREWIND, NOUNLOAD,  STATS = 5'
    Pareil j'ai essayé dans tous les sens sauf celui qu'il faut j'imagine...

    édit: ça a l'air bon avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      PRINT 'BACKUP DATABASE [' + @name + '] TO DISK = ''[' + @filename + ']''
    		WITH NOFORMAT, INIT, SKIP, NOREWIND, NOUNLOAD,  STATS = 5'

    Ce qui ne va pas maintenant c'est le chemin Il pointe vers C:\program files...

    édit 2 : Ça marche si je copie-colle le contenu du "PRINT" avec 3 ' ... et en virant les crochets...
    Si j'enlève le "PRINT" et utilise le script tel quel, ça me rend une erreur sur le nom de la base après BACKUP DATABASE sûrement à cause des crochets... Et si je les enlève ça ne passe pas non plus...

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Bon c'est réglé pour le problème au-dessus. J'ai juste utilisé @name sans ' ni rien ...

    Maintenant j'ai un souci de nom de bases trop longs! En effet, les noms de bases sont tronqués par le script.
    ( Voici la raison du nom trop long: http://www.developpez.net/forums/d16...epoint-2010-a/ )
    Si quelqu'un sait comment outre passer ça? Merci!

    Edit:
    Autre problème: le script ne crée pas les fichiers de sauvegarde malgré le message comme quoi la sauvegarde s'est terminée correctement. Ce que je ne comprends toujours pas c'est qu'avec un copier-coller du résultat du "PRINT" tout marche...

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Voici le script que j'utilise maintenant:

    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
    31
    32
    33
    34
    35
    36
    DECLARE @name VARCHAR(50) -- database name  
    DECLARE @path VARCHAR(256) -- path for backup files  
    DECLARE @fileName VARCHAR(256) -- filename for backup  
    DECLARE @fileDate VARCHAR(20) -- used for file name
     
     
    -- specify database backup directory
    SET @path = '\\serveurdistant\backupdir\'  
     
     
    -- specify filename format
    SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 
     
     
    DECLARE db_cursor CURSOR FOR  
    SELECT name 
    FROM master.dbo.sysdatabases 
    WHERE name NOT IN ('model','tempdb')  -- exclude these databases
     
     
    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @name   
     
     
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
           SET @fileName = @path + @name + '_' + @fileDate + '.BAK'  
            print 'BACKUP DATABASE [' + @name + '] TO DISK = ''' + @filename + '''
    		WITH NOFORMAT, INIT, NAME = ''' + @name + ''', SKIP, NOREWIND, NOUNLOAD,  STATS = 5'
     
           FETCH NEXT FROM db_cursor INTO @name   
    END   
     
     
    CLOSE db_cursor   
    DEALLOCATE db_cursor
    Ici, tout se passe bien.
    Dès que j'enlève le "PRINT", j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Msg*911, Niveau*16, État*11, Ligne*28
    La base de données '' + @name + '' n'existe pas. Assurez-vous que le nom a été saisi correctement.
    Msg*3013, Niveau*16, État*1, Ligne*28
    BACKUP DATABASE s'est terminé anormalement.
    Msg*911, Niveau*16, État*11, Ligne*28
    La base de données '' + @name + '' n'existe pas. Assurez-vous que le nom a été saisi correctement.
    Msg*3013, Niveau*16, État*1, Ligne*28
    BACKUP DATABASE s'est terminé anormalement.
    Msg*911, Niveau*16, État*11, Ligne*28 
    Etc.
    Merci pour votre aide!

    Pour l'autre problème (les noms de base trop long) j'imagine que je peux me servir de l'identifiant de la base? Mais je ne sais pas comment l'intégrer au script.

  9. #9
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    que donne le print ?
    Cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    voici le résultat du print:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BACKUP DATABASE [master] TO DISK = '\\serveurdistant\backupdir\master_20160916.BAK'
          	WITH NOFORMAT, INIT, NAME = 'master', SKIP, NOREWIND, NOUNLOAD,  STATS = 5
    BACKUP DATABASE [msdb] TO DISK = '\\serveurdistant\backupdir\msdb_20160916.BAK'
          	WITH NOFORMAT, INIT, NAME = 'msdb', SKIP, NOREWIND, NOUNLOAD,  STATS = 5
    [ etc. avec une ligne par base de données]
    Merci!

  11. #11
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    heuh j'ai peur d'avoir compris
    ton print, tu l'enlèves certe... mais tu le remplaces par quoi?
    dans ta déclaration tu ajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare @SQLCMD nvarchar(250)
    et tu remplaces ton print par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set @SQLCMD = 'BACKUP DATABASE [' + @name + '] TO DISK = ''' + @filename + '''
    		WITH NOFORMAT, INIT, NAME = ''' + @name + ''', SKIP, NOREWIND, NOUNLOAD,  STATS = 5'
    		exec sp_executesql @SQLCMD
    Cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Merci pour ton aide Bernardos!
    Le script s'exécute avec quelques erreurs qui ont l'air de venir des noms des bases:

    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
    Msg*105, Niveau*15, État*1, Ligne*2
    Ouvrez les guillemets après la chaîne de caractères 'Application_Registry_Ser'.
    Msg*102, Niveau*15, État*1, Ligne*2
    Syntaxe incorrecte vers 'Application_Registry_Ser'.
    Msg*105, Niveau*15, État*1, Ligne*2
    Ouvrez les guillemets après la chaîne de caractères 'Application de service d'.
    Msg*102, Niveau*15, État*1, Ligne*2
    Syntaxe incorrecte vers 'Application de service d'.
    Msg*105, Niveau*15, État*1, Ligne*2
    Ouvrez les guillemets après la chaîne de caractères 'Application de service d'.
    Msg*102, Niveau*15, État*1, Ligne*2
    Syntaxe incorrecte vers 'Application de service d'.
    Msg*105, Niveau*15, État*1, Ligne*2
    Ouvrez les guillemets après la chaîne de caractères 'Application de service d'.
    Msg*102, Niveau*15, État*1, Ligne*2
    Syntaxe incorrecte vers 'Application de service d'.
    Msg*105, Niveau*15, État*1, Ligne*2
    Ouvrez les guillemets après la chaîne de caractères 'Bdc_Service_DB_e5097008a27448c'.
    Msg*102, Niveau*15, État*1, Ligne*2
    Syntaxe incorrecte vers 'Bdc_Service_DB_e5097008a27448c'.
    Il faut savoir qu'il y a des bases dont les noms contiennent des espaces et des accents...

    Pour en revenir à ta correction, comment se fait-il que mon script ne fonctionnait pas avec seulement la commande SQL BACKUP et qu'il faille l'exécuter avec la PS?

    Merci!

  13. #13
    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
    Citation Envoyé par nutopia Voir le message
    Il faut savoir qu'il y a des bases dont les noms contiennent des espaces et des accents...
    C'est pour cela que dans mes article je donne une fonction pour nettoyer de telle conneries avant de créer le script de sauvegarde :
    http://blog.developpez.com/sqlpro/p8...ec_nettoyage_d
    http://blog.developpez.com/sqlpro/p6...ses_de_donnees

    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/ * * * * *

  14. #14
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Je ne suis pas autorisé à modifier ces noms à la con...

  15. #15
    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
    Citation Envoyé par nutopia Voir le message
    Je ne suis pas autorisé à modifier ces noms à la con...
    Au lieu de dire n'importe quoi, lisez les articles, vous ferez preuve d'intelligence !!!

    En effet, cette fonction ne propose pas de modifier le noms des bases de données, ce qui serait stupide, mais de remplacer les caractères parasites dans les noms illicites afin de pouvoir être utilisé d'autre part, par exemple et justement si vous l'aviez lu, dans un nom de fichier !

    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/ * * * * *

  16. #16
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Calmez-vous SVP. Ça doit être mon "à la con" qui vous a excité. Il allait pourtant dans votre sens et faisait écho à votre "de telle_ conneries". Etant bien d'accord que mettre des accents et des espaces dans un nom de base de données est une belle connerie...

    Je ne vois pas où je dis "n'importe quoi" dans l'autre partie de la phrase: "Je ne suis pas autorisé à modifier ces noms". C'est un fait: je ne suis pas autorisé à modifier ces noms. Mais effectivement je n'ai pas lu votre lien étant donné que vous l'aviez présenté ainsi:"un nettoyage". Avouez que c'est confusant.

    Là je lis vos scripts et n'y comprends pas grand-chose mais je vais essayer de les adapter à mon cas...
    Bref, je vous remercie pour vos scripts !

  17. #17
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    A l'exécution de P_SAVE_DB, sur une base dont le nom comporte des espaces, j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Msg*8164, Niveau*16, État*1, Procédure*P_FILES, Ligne*27
    Une instruction INSERT EXEC ne peut pas être imbriquée.
     
    (0*ligne(s) affectée(s))
    1280 pages traitées pour la base de données 'Application de service de profil utilisXXX', fichier 'Application de service de profil utilisXXX' dans le fichier 1.
    4 pages traitées pour la base de données 'Application de service de profil utilisXXX', fichier 'Application de service de profil utilisXXX_log' dans le fichier 1.
    BACKUP DATABASE a traité avec succès 1284 pages en 0.150*secondes (66.829*Mo/s).
     
    (0*ligne(s) affectée(s))
    De même avec une base dont le nom comporte des accents:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Msg*8164, Niveau*16, État*1, Procédure*P_FILES, Ligne*27
    Une instruction INSERT EXEC ne peut pas être imbriquée.
     
    (0*ligne(s) affectée(s))
    296 pages traitées pour la base de données 'Service de métadonnées géréesXXX', fichier 'Service de métadonnées géréesXXX' dans le fichier 1.
    2 pages traitées pour la base de données 'Service de métadonnées géréesXXX', fichier 'Service de métadonnées géréesXXX_log' dans le fichier 1.
    BACKUP DATABASE a traité avec succès 298 pages en 0.074*secondes (31.447*Mo/s).
     
    (0*ligne(s) affectée(s))
    Les .bak sont bien créés avec des noms débarrassés des espaces et accents.

    Je ne sais pas à quel point ce message d'erreur est impactant.

  18. #18
    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
    Citation Envoyé par nutopia Voir le message
    A l'exécution de P_SAVE_DB, sur une base dont le nom comporte des espaces, j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Msg*8164, Niveau*16, État*1, Procédure*P_FILES, Ligne*27
    Une instruction INSERT EXEC ne peut pas être imbriquée.
    ...
    En général ce message se produit si vous essayez d'encapsuler ce code dans une transaction... Avez vous initialiser cette sauvegarde avec une transaction ?

    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/ * * * * *

  19. #19
    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,

    Ce message se produit lorsque vous effectuez un INSERT INTO UneTable EXEC UneProcedure, alors que UneProcedure effectue elle-même un INSERT INTO UneTable EXEC UneAutreProcedure : Vous ne pouvez pas imbriquer les INSERT INTO EXEC.

    Ici, la procédure P_FILES effectue ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO @T 
     
    EXEC xp_cmdshell @COM;
    Vous ne pouvez donc pas faire de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO @TF (FNAME, FDATE, FSIZE) 
    EXEC P_FILES

  20. #20
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    Merci pour vos réponses.

    @sqlpro:
    Non, je n'ai pas utilisé de "BEGIN TRAN", j'ai directement tapé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC S_MAINT.P_SAVE_DB 'Service de métadonnées gérées_d333429a41324263972dae7738100f73', 'S:\SauvSQL\', 1, 3;
    @aieeeuuuuu:
    J'ai effectivement utilisé les scripts tels-quels. Je ne les comprends pas assez pour pouvoir les modifier et corriger cette imbrication.

    Pour en revenir peut-être à quelque chose de plus simple: sans procédures, fonctions, imbrications incompatibles etc. Si je peux juste utiliser un "id" de base de données au lieu des noms des bases dans mon script de base, je devrais pouvoir sauvegarder toutes les bases sans erreurs...

Discussions similaires

  1. Script pour sauvegarde OVH
    Par d10g3n dans le forum Linux
    Réponses: 6
    Dernier message: 18/12/2006, 16h09
  2. Shell script de sauvegarde
    Par marza dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 22/11/2006, 22h32
  3. Script de sauvegarde FTP
    Par goldorax113 dans le forum Développement
    Réponses: 5
    Dernier message: 09/11/2006, 11h08
  4. Script de sauvegarde sous REDHAT 7.3
    Par florfilla18 dans le forum Linux
    Réponses: 12
    Dernier message: 22/08/2006, 17h03
  5. erreur sur script de sauvegarde
    Par zouetchou dans le forum Langage
    Réponses: 5
    Dernier message: 08/12/2005, 08h50

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