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 :

Problème de privilège étonnant !


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut Problème de privilège étonnant !
    Bonjour à tous,

    J'ai un problème de privilège avec mon code PL/SQL que je n'ai pas sous SQL.

    voici ma procédure dans son paquet :
    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
    -- Create Package
    CREATE OR REPLACE PACKAGE pkg IS
      -- Create Table
      PROCEDURE create_table (table_name IN VARCHAR2 );
    END;
    /
     
    CREATE OR REPLACE PACKAGE BODY pkg IS
      PROCEDURE create_table ( table_name IN VARCHAR2) IS
          create_tab   varchar2(100);
      BEGIN
         create_tab := 'CREATE TABLE ' || table_name || ' AS SELECT * FROM v$session';
         EXECUTE IMMEDIATE create_tab;
    END;
     
    END;
    /
    voici ma commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BEGIN
      pkg.create_table( 'toto' );
    END; 
    /
    Mon erreur :
    Rapport d'erreur :
    ORA-01031: privilèges insuffisants
    ORA-06512: à "USER.PKG", ligne 14
    ORA-06512: à ligne 2
    01031. 00000 - "insufficient privileges"

    J'ai lu que l'erreur ORA-06512 pouvait être du à une variable trop petite pour la valeur stockée. Cependant, modifier la taille de varchar2(100), n'a rien changé.

    Merci d'avance pour vos réponses !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut
    ce qui étrange, c'est que mon code fonctionne quand je remplace la requête :

    create_tab := 'CREATE TABLE ' || table_name || ' AS SELECT * FROM v$session';
    par

    create_tab := 'TRUNCATE TABLE ' || table_name ;
    (une fois que j'ai créée ma table toto au préalable.)

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Bref, c’est un problème récurrent: en PL/SQL les privilèges doivent être accordés directement et non pas via des roles.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut
    ok je ne savais pas. Je vais donc voir avec mon DBA senior. Merci pour cette info étonnante !

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Étonnant, mais il y a une raison à cela. Les rôles ne sont pas des privilèges acquis pour toujours. On peut activer ou désactiver un rôle au cours de la vie de l'appli. C'est quelque chose de dynamique. Utilisés lorsque les droits sont vérifiés au moment de l'exécution (ou plus précisément du parsing).
    Par contre, les procédures vérifient les privilèges au moment où elles sont compilées. Elles ont besoins de privilèges statiques définis au moment du déploiement de l'appli. Et ça c'est des grants directs.
    Cordialement,
    Franck.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Très bon complément Pachot.
    J'en ajoute un plus ou moins lié à l'utilisation de la procedure mais c'est un bon reflexe à avoir.
    Il faut se méfier très fortement des requêtes dynamiques dues à leur risque d'injection sql.
    Le package dbms_assert permet de s'assurer que des noms de tables ou de colonnes passées dynamiquement ne sont pas vulnérables. (pour des valeurs USING suffit)
    Donc la chaîne create_tab devrait s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create_tab := 'CREATE TABLE ' || dbms_assert.simple_sql_name(table_name) || ' AS SELECT * FROM v$session';

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/11/2007, 14h29
  2. Problème de privilèges insuffisants
    Par lokazouzou dans le forum Oracle
    Réponses: 1
    Dernier message: 08/10/2007, 09h30
  3. Réponses: 2
    Dernier message: 06/12/2006, 08h54
  4. Problèmes de privilèges pour mes rôles
    Par missbug dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/07/2006, 10h31
  5. [10g] Problème de privilège dans une requête
    Par hotkebab99 dans le forum Oracle
    Réponses: 6
    Dernier message: 01/03/2006, 12h00

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