Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/11/2011, 15h04   #1
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
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 :
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 :
1
2
3
4
BEGIN
  pkg.create_table( 'toto' );
END; 
/
Mon erreur :
Citation:
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 !
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 16h23   #2
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
ce qui étrange, c'est que mon code fonctionne quand je remplace la requête :

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

Citation:
create_tab := 'TRUNCATE TABLE ' || table_name ;
(une fois que j'ai créée ma table toto au préalable.)
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 16h47   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 813
Points : 5 813
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/11/2011, 08h42   #4
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
ok je ne savais pas. Je vais donc voir avec mon DBA senior. Merci pour cette info étonnante !
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 21h36   #5
Membre Expert
 
Avatar de pachot
 
Homme Franck Pachot
DBA Oracle
Inscription : novembre 2007
Messages : 706
Détails du profil
Informations personnelles :
Nom : Homme Franck Pachot
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : DBA Oracle
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2007
Messages : 706
Points : 1 645
Points : 1 645
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.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
pachot est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 18/11/2011, 22h54   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
create_tab := 'CREATE TABLE ' || dbms_assert.simple_sql_name(table_name) || ' AS SELECT * FROM v$session';
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h57.


 
 
 
 
Partenaires

Hébergement Web