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 :

create and grant privileges dynamique tables plsql


Sujet :

PL/SQL Oracle

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut create and grant privileges dynamique tables plsql
    Bonjour à tous,

    j'ai une procédure qui s'exécute chaque fin de mois de la manière suivant :

    depuis sysdate de chaque fin de mois j'obtient le num de jour et le mois et l'année
    exemple :

    pour 31/10/2018 je crée la table TABLE_31_10_2018
    avec

    mon code est à peu près le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT count(*)
        INTO nb
        FROM dba_objects
       WHERE object_type = 'TABLE'
        and owner = 'SYS'
         and object_name = table_aaa; 
     
    // avec table_aaa := CONCAT(CONCAT(CONCAT('TABLE_', mois), '_'), year);
    si nb =0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    req := 'GRANT INSERT ON TABLE_'||jour||'_'||mois||'_'||year||' TO PUBLIC ';
    EXECUTE IMMEDIATE (req)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE TABLE_'||jour||'_'||mois||'_'||year|| AS SELECT ... FROM TABLE_SOURCE WHERE ....

    alors else


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    req := 'GRANT ALL PRIVILEGES ON TABLE_'||jour||'_'||mois||'_'||year||' TO PUBLIC ';
    EXECUTE IMMEDIATE (req)
    j'ai le code erreur suivant :

    ORA-01929: pas de privilège pour GRANT

    quand je change req par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    req := 'GRANT INSERT ON TABLE_'||jour||'_'||mois||'_'||year||' TO PUBLIC ';
    EXECUTE IMMEDIATE (req)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    req := 'GRANT UPDATE ON TABLE_'||jour||'_'||mois||'_'||year||' TO PUBLIC ';
    EXECUTE IMMEDIATE (req)
    j'ai le code erreur suivant :

    ORA-01031: privilèges insuffisants

    je vous signale que la partie suivante est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE_'||jour||'_'||mois||'_'||year|| SELECT ... FROM TABLE_SOURCE WHERE ....
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE TABLE_'||jour||'_'||mois||'_'||year|| SET VAL = .... , VAL2=.... WHERE ....

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pour faire un UPDATE il faut aussi le droit SELECT

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut
    Citation Envoyé par McM Voir le message
    Pour faire un UPDATE il faut aussi le droit SELECT
    j'ai rajouté les 3 lignes dans ma procédure, mais ça ne marche toujouts pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXECUTE IMMEDIATE('GRANT SELECT ON user.MA_TABLE_'|| year ||' TO PUBLIC') ;
    EXECUTE IMMEDIATE('GRANT UPDATE ON user.MA_TABLE_'|| year ||' TO PUBLIC') ;      
    EXECUTE IMMEDIATE('GRANT INSERT ON user.MA_TABLE_'|| year ||' TO PUBLIC') ;
    mais lorsque j'exécute dans une fiche SQL WINDOWS ça fonctionne !!!!

    NB : sur SQL WINDOWS J'exécute en fixant la valeur de year a 2018 comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GRANT SELECT ON user.MA_TABLE_2018 TO PUBLIC
    GRANT INSERT ON user.MA_TABLE_2018 TO PUBLIC
    GRANT UPDATE ON user.MA_TABLE_2018 TO PUBLIC
    ou est le problème ici ?

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut
    pour quoi quand je mis dans la procédure une instruction comme ça, ça fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE('GRANT SELECT ON user.MA_TABLE_2018 TO PUBLIC') ;
    et sur SQL WINDOWS (pour une simple requête) ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GRANT SELECT ON user.MA_TABLE_2018 TO PUBLIC
    je me retrouve pas, s'il vous plaît AU SECOURS !!!

  5. #5
    Membre confirmé

    Inscrit en
    Octobre 2003
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 191
    Par défaut
    Bonjour.

    D'abord, sauf erreur de ma part, dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE_'||jour||'_'||mois||'_'||year|| SELECT ... FROM TABLE_SOURCE WHERE ....
    il manque un guillemet simple entre le mot-cle TABLE et le "table" du début du nom de ta table.

    Ensuite, utilise dbms_ouput pour vérifier les chaînes SQL que tu envoies.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set serveroutput on
    --le debut de ton code
    ...
    -- execute immediate (req);
    dbms_output.put_line(req);
    ...
    Ça te permettra de voir la requête que tu soumets et éventuellement une erreur de syntaxe.

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 484
    Par défaut
    Citation Envoyé par olivier] Voir le message
    Bonjour.

    D'abord, sauf erreur de ma part, dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE_'||jour||'_'||mois||'_'||year|| SELECT ... FROM TABLE_SOURCE WHERE ....
    il manque un guillemet simple entre le mot-cle TABLE et le "table" du début du nom de ta table.
    Erreur de ma par oui
    Ensuite, utilise dbms_ouput pour vérifier les chaînes SQL que tu envoies.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set serveroutput on
    --le debut de ton code
    ...
    -- execute immediate (req);
    dbms_output.put_line(req);
    ...
    Ça te permettra de voir la requête que tu soumets et éventuellement une erreur de syntaxe.
    c'est ce que j'ai fait en fait, ça retourne la même chaîne exécutée manuellement

  7. #7
    Membre confirmé

    Inscrit en
    Octobre 2003
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 191
    Par défaut
    tu peux faire un copier/coller de ce que te retournent les dbms_output s'il te plaît?
    je me permet d'insister sur le "copier/coller"

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/06/2016, 02h35
  2. Réponses: 7
    Dernier message: 26/02/2009, 11h42
  3. Réponses: 2
    Dernier message: 13/04/2007, 14h37
  4. Grant sur plusieurs tables
    Par Bba_M dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/06/2006, 18h28
  5. [NEXUS][D7]Creation dynamique table et évenement
    Par PhD13 dans le forum Bases de données
    Réponses: 1
    Dernier message: 03/11/2005, 19h25

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