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 :

TRY/CATCH sur xp_cmdshell et xp_delete_file


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Femme Profil pro
    Ingénieure SI
    Inscrit en
    Mars 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure SI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 17
    Points : 18
    Points
    18
    Par défaut TRY/CATCH sur xp_cmdshell et xp_delete_file
    Bonjour !

    J'ai créé une procédure qui permet de nettoyer automatiquement les backups de sql server, et ce même si ils sont compressés (avec 7zip sur sql server 2000/2005)

    Cependant, il m'arrive d'avoir une erreur quand les journaux de transaction ne sont pas sauvegardés pour une base.

    J'utilise xp_cmdshell et xp_delete_file pour supprimer les backups et j'aimerais bien attraper les exceptions qui sont levées si les répertoires n'existent pas.

    Cependant mon bloc try / catch n'attrape rien, est-ce normal ?

    Voici mon code de test :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    DECLARE @database_to_exclude VARCHAR(50);
    SET @database_to_exclude = '';
    DECLARE @database_name VARCHAR(50);
     
    DECLARE @days_to_keep int;
    DECLARE @path_of_backup_db varchar(300);
    DECLARE @path_of_backup_log varchar(300);
    DECLARE @path_of_forfiles varchar(100);
     
    SET @days_to_keep = 3;
    SET @path_of_backup_db = 'C:\temp';
    SET @path_of_backup_log = 'C:\temp\log';
    SET @path_of_forfiles = 'C:\temp\forfiles.exe';
     
    DECLARE @time datetime;
    SET @time = DATEADD(DAY, @days_to_keep, GETDATE());
     
    DECLARE @version varchar(1);
    SET @version = CONVERT(VARCHAR(1),SERVERPROPERTY('productversion'));
     
    -- Name of instance
    DECLARE @instance_name nvarchar(128);
    SET @instance_name = @@ServerName;
    -- Backup path
    DECLARE @backup_path_db varchar(400);
    DECLARE @backup_path_log varchar(400);
     
    DECLARE @cmd varchar(800);
    DECLARE @varcharDaysToKeep VARCHAR(3);
     
    SET @varcharDaysToKeep = CONVERT(VARCHAR(3),@days_to_keep);
     
    SET @path_of_backup_db = @path_of_backup_db;
    SET @path_of_backup_log = @path_of_backup_log;
     
    SET @database_name = 'model'
     
     
    BEGIN TRY
     
        SET @backup_path_log = @path_of_backup_log + '\' + REPLACE(@instance_name,'\', '') + '\' + REPLACE(@database_name, ' ', '_');
        PRINT 'Nettoyer répertoire log : ' + @backup_path_log;     
     
        SET @cmd = @path_of_forfiles + ' -p' + @backup_path_log + '\ -m*.7z -c"cmd /c echo @PATH\@FILE est un fichier de backup log 7z vieux de plus de ' + @varcharDaysToKeep + ' jours" -d' + @varcharDaysToKeep + ' >> ' + @backup_path_log + '\log_del.txt';
        EXEC xp_cmdshell @cmd;
     
        SET @cmd = @path_of_forfiles + ' -p' + @backup_path_log + '\ -m*.7z -c"cmd /c del @PATH\@FILE" -d' + @varcharDaysToKeep;
        EXEC xp_cmdshell @cmd;
     
        EXECUTE master.dbo.xp_delete_file 0, @backup_path_log, N'trn', @time, 1;
        PRINT @backup_path_log
     
    END TRY
    BEGIN CATCH
        PRINT '  Entering CATCH block.';
     
     
            PRINT '    File not found';
     
     
        PRINT '    Error Number  : ' + CAST(ERROR_NUMBER() AS VARCHAR(10));
        PRINT '    Error Message : ' + ERROR_MESSAGE();
        PRINT '    Error Severity: ' + CAST(ERROR_SEVERITY() AS VARCHAR(10));
        PRINT '    Error State   : ' + CAST(ERROR_STATE() AS VARCHAR(10));
        PRINT '    Error Line    : ' + CAST(ERROR_LINE() AS VARCHAR(10));
        PRINT '    Error Proc    : ' + ISNULL(ERROR_PROCEDURE(), 'Not within proc');
     
        PRINT '  Exiting CATCH block.';    
     
    END CATCH
    GO

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Ceci est un bug connu :
    http://connect.microsoft.com/SQLServ...-is-not-caught

    Une solution de contournement consiste à utiliser xp_cmdshell qui permet de pouvoir gérer les erreurs dans le bloc catch.

    ++

  3. #3
    Membre à l'essai
    Femme Profil pro
    Ingénieure SI
    Inscrit en
    Mars 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure SI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Bonjour,

    Ceci est un bug connu :
    http://connect.microsoft.com/SQLServ...-is-not-caught

    Une solution de contournement consiste à utiliser xp_cmdshell qui permet de pouvoir gérer les erreurs dans le bloc catch.

    ++
    J'avais vu ça, mais bon, ça fait 3 ans que le bug est connu...

    Et pour xp_cmdshell, je l'utilise aussi dans mon code, si tu as vu, et comment je peux récupérer l'erreur dans le try/catch ?

    J'adore la doc de microsoft, en tant que dba, c'est le bordel pour trouver de la documentation sur certaines fonction, et on doit inventer de nouvelles choses pour que ça fonctionne, exemple : le log shipping avec des compte sys locaux...

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Avec xp_cmdshell tu peux par exemple récupérer le code erreur comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BEGIN TRY
     @result = EXECUTE master.dbo.xp_cmdshell '...'
     IF @result <> 0 RAISERROR(...)
     
    END TRY
    BEGIN CATCH
     PRINT 'ERREUR ...'
    END CATCH
    ++

  5. #5
    Membre à l'essai
    Femme Profil pro
    Ingénieure SI
    Inscrit en
    Mars 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure SI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Heu voilà ce que j'ai :

    @result_clean_z = EXECUTE xp_cmdshell @cmd;
    IF @result_clean_z <> 0 RAISERROR('50000 Path not found',16,1);

    Msg 102, Level 15, State 1, Procedure sp_SFR_BackupCleanup, Line 149
    Incorrect syntax near '@result_clean_z'.


    J'ai du me planter quelque part, mais où ?

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Il doit manquer le SET ... J'ai écrit un peu rapidement la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @result_clean_z = EXECUTE xp_cmdshell @cmd;
    IF @result_clean_z <> 0 RAISERROR('50000 Path not found',16,1);
    ++

  7. #7
    Membre à l'essai
    Femme Profil pro
    Ingénieure SI
    Inscrit en
    Mars 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure SI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Même avec le SET j'ai le même résultat :

    Msg 156, Level 15, State 1, Procedure sp_SFR_BackupCleanup, Line 149
    Incorrect syntax near the keyword 'EXECUTE'.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SET @cmd = @path_of_forfiles + ' -p' + @backup_path_db + '\ -m*.7z -c"cmd /c echo @PATH\@FILE est un fichier de backup db 7z vieux de plus de ' + @varcharDaysToKeep + ' jours" -d' + @varcharDaysToKeep + ' >> ' + @backup_path_db + '\log_del.txt';
     
    SET @result_clean_z = EXECUTE xp_cmdshell @cmd;
    IF @result_clean_z <> 0 RAISERROR('50000 Path not found',16,1);
    Vraiment merci de m'aider parce que je suis dépassée là

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    On va y arriver ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET @cmd = @path_of_forfiles + ' -p' + @backup_path_db + '\ -m*.7z -c"cmd /c echo @PATH\@FILE est un fichier de backup db 7z vieux de plus de ' + @varcharDaysToKeep + ' jours" -d' + @varcharDaysToKeep + ' >> ' + @backup_path_db + '\log_del.txt';
     
    EXECUTE @result_clean_z = xp_cmdshell @cmd;
    IF @result_clean_z <> 0 RAISERROR('50000 Path not found',16,1);
    ++

  9. #9
    Membre à l'essai
    Femme Profil pro
    Ingénieure SI
    Inscrit en
    Mars 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure SI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Merci ça marche !!!!

    (Désolée de la lenteur de mes réponses, mais j'ai pas mal de trucs à faire aussi bien sur du sql server que du mysql et du oracle aujourd'hui)

    Quand même, microsoft aurait pu faire un truc simple...

Discussions similaires

  1. Try Catch (?) sur une erreur d'accès mémoire
    Par Jflop91 dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2013, 15h36
  2. Gérer un try catch sur un scan.nextInt() en boucle
    Par ermite67 dans le forum Langage
    Réponses: 3
    Dernier message: 16/06/2010, 17h14
  3. Interrogation sur : Try.Catch.Finally
    Par Seth77 dans le forum C#
    Réponses: 7
    Dernier message: 16/09/2008, 11h22
  4. Précision sur le try/catch
    Par Faiche dans le forum Langage
    Réponses: 2
    Dernier message: 13/07/2007, 21h18
  5. Erreur de runtime sur un try ... catch
    Par Floréal dans le forum C++
    Réponses: 14
    Dernier message: 09/09/2005, 19h15

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