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

PL/SQL Oracle Discussion :

Donner des droits sur un objet d'un autre utilisateur


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Élève
    Inscrit en
    Avril 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Avril 2004
    Messages : 97
    Points : 62
    Points
    62
    Par défaut Donner des droits sur un objet d'un autre utilisateur
    Bonjour,

    Connecté sur ma base avec le user system, j'ai créé un package PL/SQL P1 qui :

    1) créé une table T1 dans un autre user U2.
    2) donne les droits à un autre user U3, de faire un select sur cette même T1

    La création de la table se passe bien mais je n'arrive pas à donner les droits à mon autre user U3.
    J'ai l'erreur "ORA-01031 : privilèges insuffisants."

    Je sais que les rôles ne sont pas pris en compte quand on est dans du PL/SQL mais je n'arrive toutefois pas à m'en sortir.

    Si hors PL/SQL je fais un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grant select on U2.T1 to system;
    j'obtiens l'erreur : "ORA-01749 : vous ne pouvez pas vous accorder ou vous enlever (GRANT/REVOKE) des privilèges."

    Que faut-il donc que je fasse pour qu'au sein de mon package je puisse donner les droits à U3 de faire un select sur T1 ?
    (c'est pourtant ma procédure stockée qui créé T1 !)

    Merci pour votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Sous SQL*Plus, comme SYSTEM, si tu fais
    grant select on U2.T1 to u3;
    ce n'est pas ce que tu veux? Si ça plante pour cause de privilège insuffisant, connecte-toi, si possible, comme SYS, ça devrait passer.

    Sinon, peut-être que tu peux donner les droits via du SQL Dynamique dans ta procédure; à essayer.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Membre du Club
    Profil pro
    Élève
    Inscrit en
    Avril 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Avril 2004
    Messages : 97
    Points : 62
    Points
    62
    Par défaut
    Rappel : je veux passer mes commandes dans une procédure stockée.
    Dans ce cas, la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grant select on U2.T1 to u3;
    ne marche pas. J'ai l'erreur "ORA-01031 : privilèges insuffisants."

    Faut-il absolument être avec le compte SYS pour que ça marche ?

    Qu'est-ce que tu entends par : "donner les droits via du SQL Dynamique" ?

  4. #4
    Membre du Club
    Profil pro
    Élève
    Inscrit en
    Avril 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Avril 2004
    Messages : 97
    Points : 62
    Points
    62
    Par défaut
    N'y aurait-il pas un droit à donner au compte système pour qu'il puisse être en mesure d'effectuer cette action ?

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Citation Envoyé par blackstrobe Voir le message
    Qu'est-ce que tu entends par : "donner les droits via du SQL Dynamique" ?
    Ca signifie que tu mets dans ton code PL/SQL un ordre SQL dans un VARCHAR2 correspondant à ton GRANT et que ensuite tu fais du EXECUTE IMMEDIATE.
    N'étant pas chez moi, je ne peux pas tester si c'est une solution mais voilà un exemple repris d'un très bon article : http://sheikyerbouti.developpez.com/execute_immediate/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FUNCTION Compte_rec
      (
            PC$Table IN VARCHAR2,
            PC$ClauseWhere IN VARCHAR2
      ) RETURN PLS_INTEGER
    IS
      LC$Requete      VARCHAR2(512) ;
      LN$Total        PLS_INTEGER ;
    BEGIN
      LC$Requete := ‘Select count(*) From ‘ || PC$Table || ‘ where ‘ || PC$ClauseWhere ;
      EXECUTE IMMEDIATE LC$Requete INTO LN$Total ;
      return LN$Total ;
    END ;
    Maintenant, ce n'est pas dit que ça corrige ton pb car ça concerne des privilèges...


    Ces histoires de droits sont pénibles mais si en plus on ajoute dessus les pbs liés aux rôles et au PL/SQL et qu'en plus tu dois gérer les objets d'autres users

    Un truc tordu serait, comme SYSTEM, de créer une procédure dans le schéma U2 qui fait grant select on T1 to u3; de la sorte u3 reçoit des droits directement du propriétaire de la table donc il ne devrait plus y avoir de pb de droit.
    Une fois ta table créée, tu appelles cette procédure en étant connecté comme SYSTEM mais en préfixant bien la procédure par le nom U2.

    C'est tordu mais bon...
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  6. #6
    Membre du Club
    Profil pro
    Élève
    Inscrit en
    Avril 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Avril 2004
    Messages : 97
    Points : 62
    Points
    62
    Par défaut
    Quelqu'un m'a donné la solution : il faut utiliser la propriété "authid current_user"
    Cela permet d'utiliser dans du PL/SQL les privilèges accordés par des rôles au user (dans mon cas SYSTEM).
    Sans cette propriété, seuls les privilèges accordés "en direct" sont pris en compte. Ceux accordés via des rôles ne sont pas reconnus.

    Merci en tout cas pour ton aide

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

Discussions similaires

  1. donner des droits a tout users sur la commande /etc/init.d/sendmail start
    Par moussadjijunior dans le forum Administration système
    Réponses: 2
    Dernier message: 03/06/2011, 13h21
  2. Comment donner des droits sur tous les objets d'un schéma
    Par farenheiit dans le forum Administration
    Réponses: 2
    Dernier message: 07/06/2007, 16h27
  3. Donner des suggestions sur le site Web en général
    Par kissmytoe dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 20/03/2006, 16h35
  4. [Répertoire] Donner des droits à un dossier
    Par peck dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2006, 16h32

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