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 sur procédure qui fait un simple delete executée en system


Sujet :

PL/SQL Oracle

  1. #1
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut ORA-01031 sur procédure qui fait un simple delete executée en system
    Bonjour,

    Je suis sous oracle 10g sous windows 2003 server. Je suis confronté à un problème bien étrange :

    Soit la procédure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PROCEDURE CLEANGPS(NBJOURSCONSERVE IN NUMBER, NOMSCHEMA IN VARCHAR2) IS
    request VARCHAR2(500);
    BEGIN
    request :='delete '||NOMSCHEMA||'.pointgps where datetime < (select max(datetime)-'|| nbjoursconserve||' from '||NOMSCHEMA||'.pointgps)';
    execute immediate request;
     /*dbms_output.put_line(request);*/
    commit;
    END CLEANGPS;
    un truc de base qui supprime tous les points gps d'une table qui datent de plus de x jours (datetime est du type number).

    Si j'exécute ma procédure loggé en system :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin
    EXEO_UTILS.cleangps(100,'test');
    end;
    je me prend un ORA-01031: privilèges insuffisants

    si je fais afficher la requête qui devait s'éxécuter et que je la lance manuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete test.pointgps where datetime < (select max(datetime)-100 from test.pointgps);
    ça fonctionne parfaitement... mais vu que je veux lancer cette tache en job je veux l'encapsuler dans une procédure...

    quelqu'un a une idée ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Points : 95
    Points
    95
    Par défaut
    ta procedure est créée par kel user?
    parce que par defaut une procedure est exécutée sous les droits de l'owner de la procedure et pas avec les privileges de l'utilisateur qui exécute la procedure.

  3. #3
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    La procédure est bien crée par l'utilisateur system.

    comment vérifier que tout est ok à ce niveau ?

  4. #4
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    C'est une procédure que vous devez ré écrire !
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    SQL> create table t_bombe (a_col number);
     
    Table created
    SQL> insert into t_bombe values (1);
     
    1 row inserted
     
    SQL> commit;
     
    Commit complete
     
    SQL> select * from t_bombe;
     
         A_COL
    ----------
             1
     
    SQL> 
    SQL> begin
      2    cleangps(100,'t_bombe --');
      3  end;
      4  /
     
    PL/SQL procedure successfully completed
     
    SQL> select * from t_bombe;
     
         A_COL
    ----------

  5. #5
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    j'ai rien compris ...

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par neo.51 Voir le message
    j'ai rien compris ...
    Cherchez SQL Injection dans google.
    Vous utilisez quelle version d'Oracle ?

  7. #7
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    ok je vois mieux où vous vouliez en venir.

    En exécutant la procédure avec t_bombe tout se passe normalement. Pas de message d'erreur.

    Donc system a bien les droits d'exécution sur la procédure. system est bien en quota unlimited sur le schema "test".

    Le suis sous oracle 10g sous windows 2003 server

  8. #8
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Pour pouvoir faire ça dans une procédure avec un EXECUTE IMMEDIATE, il faut que EXEO_UTILS aie les droits explicitement sur cette table, et qu'il ne les hérite pas de son rôle.

    Il faut donc faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grant delete on <schema>.pointgps to exeo_utils;

  9. #9
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Voilà ce qui vous manque
    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
    19
    20
    21
    22
     
    SQL> delete mni.pointgps;
     
    0 ligne(s) supprimÚe(s).
     
    SQL> exec cleangps(100,'mni')
    BEGIN cleangps(100,'mni'); END;
     
    *
    ERREUR Ó la ligne 1 :
    ORA-01031: privilÞges insuffisants
    ORA-06512: Ó "SYSTEM.CLEANGPS", ligne 5
    ORA-06512: Ó ligne 1
     
     
    SQL> grant delete any table to system;
     
    Autorisation de privilÞges (GRANT) acceptÚe.
     
    SQL> exec cleangps(100,'mni')
     
    ProcÚdure PL/SQL terminÚe avec succÞs.
    Mais franchement je ne voudrais pas d’une pareille procédure pour l’utilisateur system dans ma base.

  10. #10
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Disons que je suis en phase de test. Effectivement je pense que je vais revoir ma copie et mettre la procédure par schema.

    en tous cas merci pour votre aide

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/05/2010, 16h51
  2. Réponses: 4
    Dernier message: 28/09/2009, 10h07
  3. probleme UPDATE qui fait INSERT puis DELETE
    Par CAML dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/08/2007, 12h48
  4. Réponses: 5
    Dernier message: 09/11/2006, 21h27
  5. [Res]Procédure stockée qui fait un insert basé sur un select
    Par wonderliza dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/12/2005, 18h25

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