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 :

ORA-01031: privilèges insuffisants lors de l'exécution de la commande EXECUTE IMMEDIATE 'Create Table X' [11g]


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut ORA-01031: privilèges insuffisants lors de l'exécution de la commande EXECUTE IMMEDIATE 'Create Table X'
    Bonjour,

    J'ai un programme qui fait un execute immediate 'Create table X as select * from table Y@DBLINK'.
    L'exécution du programme ne pose aucun problème à partir de la ligne de commande mais quand je lance la procedure à partir d'un job (DBMS_JOB.SUBMIT ) alors j'ai le message d'erreur suivant: ORA-01031: privilèges insuffisants et la table n'est pas créée.

    Quelqu'un a une idée du droit manquant?

    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE
        jobno number;
        begin 
        DBMS_JOB.SUBMIT (jobno,' CHM_MOB.PACK_CHM_MOB.EXPORT_DONNEES_MOBILES; commit;',sysdate, ''); 
       commit ;
       end ;
     /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .....
    execute immediate 'create table chm_mob.soldes as select * from chm.soldes@dbl_b';
    ....

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 139
    Points : 1 919
    Points
    1 919
    Par défaut
    Bonjour,

    Quelle est la version de la BDD?
    Il faut savoir que l'utilisation de DBMS_JOB est déprécié depuis plus de 10 ans. Le seul cas où il est légitime de l'utiliser plutôt que DBMS_SCHEDULER est quand il est appelé dans le cadre d'un trigger qui donc dépend de l'issue de la transaction (car DBMS_JOB est transactionnel contrairement à DBMS_SCHEDULER).
    Pour ton problème il faudrait avoir la ligne de code exact ou l'erreur se produit. Déjà, est-ce que l'appel de la procédure en dehors du job fonctionne?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec CHM_MOB.PACK_CHM_MOB.EXPORT_DONNEES_MOBILES;
    D'ailleurs, à quoi correspondent CHM_MOB et PACK_CHM_MOB?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Bonjour Vanagreg,
    Je suis en 11g.
    L'appel de la proc en dehors du job fonctionne.
    La commande qui ne passe pas et génère l'erreur est: execute immediate 'Create table chm_mob.soldes as select * from chm.soldes@dbl_b';
    CHM_MOB est le schémas. PACK_CHM_MOB est le package ou est définie la procédure EXPORT_DONNEES_MOBILES

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Re,

    J'ai remplacé DBMS_JOB par DBMS_SCHEDULER mais j'ai toujours le même probème.
    L'instruction execute_immediate 'Create table Schema1.X as select * from Schema2.Y@dblink' genere l'erreur ORA-01031: Privilèges insuffisants


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN
       DBMS_SCHEDULER.create_job (
          job_name        =>  'EXPORT_MOBILES',
          job_type        => 'STORED_PROCEDURE',
          job_action      => 'PACK_CHM_MOB.EXPORT_DONNEES_MOBILES',
          start_date      => sysdate,
          repeat_interval => 'FREQ=MINUTELY; INTERVAL=2',
          enabled         => TRUE);
    END;

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 139
    Points : 1 919
    Points
    1 919
    Par défaut
    As-tu bien le privilège CREATE TABLE avec un quota?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from user_sys_privs;

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Voici le résultat de la requette: select * from user_sys_privs;

    USERNAME: CHM_MOB
    PRIVILEGE: UNLIMITED TABLESPACE
    ADMIN_OPTION: NO



    Il manque quelque chose?
    Merci de ton aide.

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 139
    Points : 1 919
    Points
    1 919
    Par défaut
    Oui, CREATE TABLE. Avec un utilisateur admin:

    grant create table to chm_mob;

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Merci bcp vanagreg. a marche maintenant.

    Je ne comprends pas un truc: pourquoi je n'ai aucun probleme quand je lance ma commande dans PL/SQL (sans faire le grant) ?

  9. #9
    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
    Est-ce que tu avais reçu le droit "CREATE TABLE" via un rôle n, genre DBA, plutôt que en direct?
    Sous Oracle, quand tu fais certaines opérations en PL./SQL, les droits associés aux rôles ne sont pas pris en compte (si je me souviens bien) : ce qui explique pourquoi un CREATE TABLE dircet va passer MAIS pas si tu le mets dans un bloc PL/SQL. Comme DBMS_JOBS ou DBMS_SCHEDULER sont des packages PL/SQL, le pb doit venir de là.

    Idem lorsque tu veux accéder, via des vues, à des objets d'autres schémas : un SELECT direct est OK (si tu as les droits via un rôle) mais ça plantera via un bloc PL/SQL anonyme (le rôle n'est pas lu) : seule solution, donner les droits en direct au user.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 139
    Points : 1 919
    Points
    1 919
    Par défaut
    Citation Envoyé par strompakha Voir le message
    pourquoi je n'ai aucun probleme quand je lance ma commande dans PL/SQL (sans faire le grant) ?
    Tu veux dire quand tu lances ta commande dans un bloc pl/sql anonyme? Dans ce cas ça fonctionnera, mais si tu appelles ta procédure elle-même ça ne fonctionnera pas sans le grant.
    Tu as certainement un rôle qui te donne le droit de créer des tables, mais au sein des procédures pl/sql les rôles sont désactivés.

    Si tu lances ta commande en désactivant les rôles tu verras que ça ne fonctionnera pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
      execute immediate 'set role none';
      execute immediate 'create table chm_mob.soldes as select * from chm.soldes@dbl_b';
    end;
    /

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Je viens de vérifier et ce que tu dis est vrai.
    Je te remercie de ton aide précieuse.

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

Discussions similaires

  1. ORA-01031: privilèges insuffisants
    Par Sabact dans le forum SQL
    Réponses: 7
    Dernier message: 02/07/2018, 17h20
  2. Réponses: 5
    Dernier message: 01/02/2013, 11h40
  3. ORA-01031: privilèges insuffisants
    Par jadey dans le forum Oracle
    Réponses: 1
    Dernier message: 19/10/2009, 11h19
  4. Réponses: 10
    Dernier message: 14/04/2009, 17h18
  5. ORA-01031 : privilèges insuffisants
    Par bencot dans le forum Administration
    Réponses: 0
    Dernier message: 10/07/2008, 17h04

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