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 :

Problème avec la commande xp_delete_file


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de mouloudéen
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2005
    Messages : 193
    Par défaut Problème avec la commande xp_delete_file
    Bonjour,

    J'ai un problème lorsque j'essaie de lancer un Batch qui contient la commande xp_delete_file, qui est utilisée pour supprimer les anciens fichiers de sauvegarde.

    J'ai essayé de lancer la commande via l'invite de Commandes (CMD) et j'ai obtenu l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The EXECUTE permission was denied on the object 'xp_delete_file', database 'mssqlsystemresource', schema 'sys'
    1. Comment puis-je accorder l'autorisation d'exécution sur la PS XP_DELETE_FILE vu qu'elle n'est pas visible dans dans le volet PS Système

    Note: la session que j'utilise a le plein droit sur le répertoire qui contient les fichiers de sauvegarde à supprimer.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 017
    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 : 22 017
    Billets dans le blog
    6
    Par défaut
    Si bien entendu. Il suffit de savoir utiliser SSMS. Vous la trouverez comme toutes les procédures stockées étendues dans la base master sous :
    Programmabilité
    - procédure stockées
    -- procédure stockées étendues
    --- procédure stockées étendues systèmes

    Sinon, depuis n'importe quelle base, par requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM   sys.all_objects 
    WHERE  name = 'xp_delete_file'
    Pour définir son privilège execute sur un utilisateur de master :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    USE master;
    GO
     
    CREATE LOGIN CNX_TEST
       WITH PASSWORD = 'toto';
     
    CREATE USER USR_TEST 
       FOR LOGIN CNX_TEST;
     
    GRANT EXECUTE 
       ON xp_delete_file 
       TO USR_TEST;
    Voir à faire une procédure dans une base qui encapsule une dépersonnalisation :

    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 USER USR_TEST_DELETE_FILE WITHOUT LOGIN;
    GO
     
    CREATE PROCEDURE P_DELETE_BACKUP_FILE 
       @FILE_TYPE TINYINT = 0,          -- 0 for backup files or 1 for report files.
       @PATH NVARCHAR(256) = '',        -- The folder to delete files. The path must end with a backslash "\".
       @EXTENSION NVARCHAR(16) = 'BAK', -- This could be 'BAK' or 'TRN' or whatever you normally use.
       @DATE_MAX DATETIME = '19800101', -- Date until to deleted files.
       @SUB TINYINT = 0                 -- 0 to ignore subfolders, 1 to delete files in subfolders.
    WITH EXECUTE AS OWNER
    AS
     
    EXEC xp_delete_file @FILE_TYPE, @PATH, @EXTENSION, @DATE_MAX, @SUB;
     
    GO
     
    GRANT EXECUTE ON P_DELETE_BACKUP_FILE TO USR_TEST_DELETE_FILE;
    GO


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

  3. #3
    Membre confirmé Avatar de mouloudéen
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2005
    Messages : 193
    Par défaut
    Tout d'abord je vous remercie pour la réponse

    Citation Envoyé par SQLpro Voir le message
    Si bien entendu. Il suffit de savoir utiliser SSMS. Vous la trouverez comme toutes les procédures stockées étendues dans la base master sous :
    Programmabilité
    - procédure stockées
    -- procédure stockées étendues
    --- procédure stockées étendues systèmes

    A +
    La procédure que j'essaye d'utiliser de mon script est la suivante dbo.dx_delete_file alors que dans le liste des procédures stockées étendues systèmes affichées par le SSMS j'ai trouvé la procédure sys.xp_delete_file.

    Est ce que ces deux SPs sont les mêmes ?


    Citation Envoyé par SQLpro Voir le message

    Pour définir son privilège execute sur un utilisateur de master :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    USE master;
    GO
     
    ...
     
    GRANT EXECUTE 
       ON xp_delete_file 
       TO USR_TEST;
    A +
    J'ai exécuté la commande GRANT sur mon utilisateur, mais lorsque j'essaye d'exécuter mon batch je reçois le message suivant:

    Error executing 'xp_delete_file': Permission denied. User must be a member of 'sysadmin' server side.
    Est ce qu'il y a une solution pour lancer cette commande sans assigné le rôle sysadmin à la session qui exécute le batch ?

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 984
    Par défaut
    Citation Envoyé par mouloudéen Voir le message
    La procédure que j'essaye d'utiliser de mon script est la suivante dbo.dx_delete_file alors que dans le liste des procédures stockées étendues systèmes affichées par le SSMS j'ai trouvé la procédure sys.xp_delete_file.

    Est ce que ces deux SPs sont les mêmes ?
    Je pense que tu connais la réponse

    Petit rappel sur les la nomenclature des objets : [[[<instance>.][<database>.][<schéma>.]objet

    Ainsi
    [server1\express].msdb.dbo.bakupset identifie la vue backupset du schéma dbo, dans la base msdb, de l'instance server1\express
    Les 3 premières parties sont remplacées par les valeurs par défaut:
    * instance = l'instance qui a admis la connexion (sinon on se connecte à un serveur lié)
    * database = la base actuelle (USE ...)
    * schéma = le schéma par défaut de l'utilisateur de la base correspondant à la session en cours ; en général c'est dbo

    Comme tu le soulignes, pas le même nommage = pas le même objet

    Maintenant faut aller voir ce que contient la procédure comme instruction pour pouvoir donner les "bons" droits.

    Le truc m'a l'air assez packagé ; y a pas une doc qui traine ?

  5. #5
    Membre confirmé Avatar de mouloudéen
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2005
    Messages : 193
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Je pense que tu connais la réponse
    Oui effectivement, je connaissais la réponse mais moi je voulais dire, indirectement, que je n'ai pas trouvé la SP dbo.dx_delete_file par les méthodes proposées par SQLpro

    Si bien entendu. Il suffit de savoir utiliser SSMS. Vous la trouverez comme toutes les procédures stockées étendues dans la base master sous :
    Programmabilité
    - procédure stockées
    -- procédure stockées étendues
    --- procédure stockées étendues systèmes

    Sinon, depuis n'importe quelle base, par requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    SELECT *
    FROM sys.all_objects
    WHERE name = 'xp_delete_file'
    Pour définir son privilège execute sur un utilisateur de master :

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 017
    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 : 22 017
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par mouloudéen;12074052... je n'ai pas trouvé la SP [B
    dbo[/B].dx_delete_file par les méthodes proposées par SQLpro
    Tout simplement par ce qu'elle n'existe pas... Les procédures livrées par Microsoft ont un nom commençant par :
    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/ * * * * *

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 984
    Par défaut
    Citation Envoyé par mouloudéen Voir le message
    J'ai essayé de lancer la commande via l'invite de Commandes (CMD) et j'ai obtenu l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The EXECUTE permission was denied on the object 'xp_delete_file', database 'mssqlsystemresource', schema 'sys'
    Re,
    Après avoir relu les messages où il est question de dbo.dx_delete_file, puis de sys.xp_delete_file, j'ai relu le post initial.

    Est-ce que la situation est : l'exécution du contenu de la commande via SSMS fonctionne alors que via CMD elle plante ?

    Par ailleurs quelle est la ligne de commande CMD qui est exécutée ?

  8. #8
    Membre confirmé Avatar de mouloudéen
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2005
    Messages : 193
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Est-ce que la situation est : l'exécution du contenu de la commande via SSMS fonctionne alors que via CMD elle plante ?
    La commande marche uniquement avec un utilisateur ayant le privilège sysadmin


    Citation Envoyé par Michel.Priori Voir le message
    Par ailleurs quelle est la ligne de commande CMD qui est exécutée ?
    En fait, via SQLCMD je lance un script (fichier .sql) comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program File\Microsoft SQl Server\....\SQLCMD.EXE" -S NomServer\NomInstance -i "D:\MyScript.sql"
    Voici le contenu du fichier MyScript.sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
             DECLARE @Cutoff_Date AS NVARCHAR(19)
             SET @Cutoff_Date = CONVERT(NVARCHAR(19), DATEADD(HOUR, -60, GETDATE()), 120 )
     
             EXECUTE master.dbo.xp_delete_File 0, N'D:\TransactionLogs', N'bak', @Cutoff_Date ,1

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 984
    Par défaut
    Citation Envoyé par mouloudéen Voir le message
    La commande marche uniquement avec un utilisateur ayant le privilège sysadmin
    Oui.
    Les comptes membres du rôle sysadmin (par exemple SA) agissent en tant que le compte qui démarre le service MSSQL.


    Citation Envoyé par mouloudéen Voir le message
    En fait, via SQLCMD je lance un script (fichier .sql) comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program File\Microsoft SQl Server\....\SQLCMD.EXE" -S NomServer\NomInstance -i "D:\MyScript.sql"
    Sans option spécifique au sujet du compte utilisé pour la connexion, SQLCMD utilise l'option -E : authentifiction Windows = le compte qui lance la commande.
    Si ce compte ne fait pas partie du rôle sysadmin, il faut
    1. faire un "credential" (dans SSMS, <instance>\security\credential <clic droit> new crendential
    2. donner le droit d'utiliser la commande qui fait appel au shell au compte en question : GRANT execute ...

  10. #10
    Membre confirmé Avatar de mouloudéen
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2005
    Messages : 193
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Oui.
    Si ce compte ne fait pas partie du rôle sysadmin, il faut
    1. faire un "credential" (dans SSMS, <instance>\security\credential <clic droit> new crendential
    2. donner le droit d'utiliser la commande qui fait appel au shell au compte en question : GRANT execute ...
    Oui le compte ne fait pas partie de sysadmin.

    SVP, Est ce que vous pouvez partager un petit exemple montrant comment on peut utiliser les credentials pour exécutant une commande (master.dbo.xp_delete) nécessitant le privilège sysadmin avec user qui ne fait pas de ce rôle ?

  11. #11
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 984
    Par défaut
    Citation Envoyé par mouloudéen Voir le message
    Oui le compte ne fait pas partie de sysadmin.
    SVP, Est ce que vous pouvez partager un petit exemple montrant comment on peut utiliser les credentials pour exécutant une commande (master.dbo.xp_delete) nécessitant le privilège sysadmin avec user qui ne fait pas de ce rôle ?
    Voir la BOL : https://learn.microsoft.com/fr-fr/sq...l-server-ver16
    Même si ça parait évident : valider que le compte windows en question a bien le droit de faire l'opération voulue ...
    Et, pour respecter la règle du moindre privilège, merci de ne pas mettre ce compte admin du domaine ni même du serveur (déjà vu ...)

    Une fois le crential créé, le simple fait de donner le droit (GRANT) d'executer la commande va faire que le compte soit utilisé.

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 017
    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 : 22 017
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par mouloudéen Voir le message
    ...
    Voici le contenu du fichier MyScript.sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
             DECLARE @Cutoff_Date AS NVARCHAR(19)
             SET @Cutoff_Date = CONVERT(NVARCHAR(19), DATEADD(HOUR, -60, GETDATE()), 120 )
     
             EXECUTE master.dbo.xp_delete_File 0, N'D:\TransactionLogs', N'bak', @Cutoff_Date ,1
    Ceci n'est pas correct. Il faut un DATETIME et non pas un VARCHAR !

    De plus ne pas préciser ni le nom de la base ni le schéma (ce n'est pas dbo mais sys) pour les procédures système qui peuvent être excutées depuis n'importe quel contexte de base de données.

    Enfin terminez vos commandes par le caractères point virgule ( ; )

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @Cutoff_Date AS DATETIME;
    SET @Cutoff_Date = DATEADD(HOUR, -60, GETDATE());
    EXECUTE xp_delete_File 0, N'D:\TransactionLogs', N'bak', @Cutoff_Date ,1;
    Lisez l'article que j'ai écrit à ce sujet :
    https://blog.developpez.com/sqlpro/p...sous_ms_sql_se

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

  13. #13
    Membre confirmé Avatar de mouloudéen
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2005
    Messages : 193
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @Cutoff_Date AS DATETIME;
    SET @Cutoff_Date = DATEADD(HOUR, -60, GETDATE());
    EXECUTE xp_delete_File 0, N'D:\TransactionLogs', N'bak', @Cutoff_Date ,1;
    Idem ça ne marche pas sans l'attribution du privilège sysadmin à l'utilisateur

  14. #14
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 984
    Par défaut
    Citation Envoyé par mouloudéen Voir le message
    Idem ça ne marche pas sans l'attribution du privilège sysadmin à l'utilisateur
    L'optimisation du code ne répond pas au problème de droit ...
    Néanmoins la remarque de SQLpro n'est pas infondée !

Discussions similaires

  1. Problème avec la commande su
    Par leng dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 10/02/2005, 18h31
  2. Comment envoyer un mail avec la commande mail
    Par pi3141563 dans le forum Réseau
    Réponses: 5
    Dernier message: 21/10/2004, 14h34
  3. Problème avec la commande tar
    Par R3iTt0R dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 01/09/2004, 11h06
  4. Comment aller a la ligne avec la commande ECHO
    Par juflata dans le forum Windows
    Réponses: 3
    Dernier message: 23/06/2004, 18h11
  5. Prblème avec la commande system
    Par AnneOlga dans le forum C++Builder
    Réponses: 8
    Dernier message: 04/03/2004, 17h05

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