Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Administration
Administration Forum d'entraide sur l'administration du serveur Oracle
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 09/01/2008, 15h46   #1
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 485
Points : 1 485
Par défaut Vues DBA inacessibles pour user SYSTEM depuis une procédure

Je veux créer la procédure suivante (que j'ai simplifiée pour expliquer l'erreur) dans le schéma SYSTEM (je suis connecté en tant que SYSTEM) :
Code :
1
2
3
4
5
 CREATE OR REPLACE PROCEDURE P IS
  CURSOR C IS SELECT * FROM dba_tables;
  BEGIN 
   EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL';
  END;
Et là la compilation sort une erreur ORA-00942: table or view does not exist !
Alors qu'avec une autre vue comme all_tables par exemple ça fonctionne.

Pourtant le user SYSTEM a bien accès en lecture à la vue dba_tables (ça marche depuis une simple requête SQL)

Comment est-ce possible que SYSTEM ait accès à une vue dba depuis du code SQL mais pas du code PL/SQL ? La gestion des droits est-elle différente ? Ou bien aurais-je oublié quelque chose ?

Merci pour votre aide
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 15h58   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par scheu Voir le message
Comment est-ce possible que SYSTEM ait accès à une vue dba depuis du code SQL mais pas du code PL/SQL ? La gestion des droits est-elle différente ?
oui, en PL/SQL, les rôles ne sont pas pris en compte, seulement les privilèges

Par ailleurs, un EXECUTE IMMEDIATE est complétement inutile pour faire du DML sans valeur dynamique
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 16h20   #3
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par orafrance Voir le message
oui, en PL/SQL, les rôles ne sont pas pris en compte, seulement les privilèges
Une petite précision supplémentaire, ça fonctionne comme ça depuis Oracle 8i.
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 16h32   #4
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 485
Points : 1 485
Merci pour vos réponses j'aurai appris quelque chose
Le EXECUTE IMMEDIATE c'était juste comme exemple, j'avais simplifié le code de ma procédure
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 17h04   #5
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Une autre précision: depuis la 8i, on peut également définir une procédure stockée avec la clause AUTHID CURRENT_USER qui signifie qu'elle s'exécute avec les droits de l'utilisateur qui l'exécute (et non avec les droits du propriétaire de la procédure comme c'est le cas par défaut).

Dans ce cas on peut utiliser DBM_SESSION.SET_ROLE pour activer les rôles qui seront pris en compte par le SQL dynamique (et non statique).

Voir les exemples du Security Guide.

Ce n'est sans doute pas d'usage courant mais cela peut parfois être utile.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2008, 17h19   #6
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par pifor Voir le message
Ce n'est sans doute pas d'usage courant mais cela peut parfois être utile.
Oui en fait AUTHID CURRENT_USER est utilisé surtout pour partager le code mais pas les données. Plusieurs packages PL/SQL fournis par Oracle utilisent ce modèle.
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 10h34   #7
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 485
Points : 1 485
Citation:
Envoyé par orafrance Voir le message
oui, en PL/SQL, les rôles ne sont pas pris en compte, seulement les privilèges
Merci pour ces précisions

Néanmoins, avec du recul j'ai du mal à comprendre pourquoi les rôles ne sont pas pris en compte en PL/SQL ... Quels problèmes de sécurité cela peut-il engendrer ?
Quelqu'un aurait-il un exemple concret ?
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 10h52   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
y'a rien à comprendre... c'est comme ça c'est tout
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h42.


 
 
 
 
Partenaires

Hébergement Web