SQL - Grant - Distribution de droits

Fermé
mezcalouz Messages postés 1 Date d'inscription vendredi 15 décembre 2006 Statut Membre Dernière intervention 15 décembre 2006 - 15 déc. 2006 à 22:06
 Julien - 19 oct. 2010 à 19:20
Bonsoir,
Je viens d'installer Oracle, et j'ai crée plusieurs utilisateurs.
Je voudrais permettre a un utilisateur A d'avoir tous les droits sur les tables de l'utilisateur B qui commencent par PUBLIC_xxx.
Le probleme, c'est que Grant n'accepte pas de sous requete du type
GRANT SELECT, UPDATE, INSERT
ON (SELECT table_name
from all_tables
where owner = 'B'
and table_name LIKE 'PUBLIC_%' )
TO 'A';
Quelqu'un sait comment je pourrais faire ca? A part autoriser chaque table une par une.
Merci !

2 réponses

Le problème d'un GRANT c'est justement le fait qu'on ne puisse pas passer par un SELECT dans la distribution.

Je ne connais pas grand chose en allocations de droits mais peut être en créant une vue sur all_tables tu pourrais sélectionner le résultat de ta vue dans le paramètre ON [...]

Si ça ne fonctionne pas il reste le système D courageux, tu prends table par table en espérant pour toi que ta base n'ai pas x^100 tables, ça deviendrait un peu long...

La technique du loop est pas mal mais pour le dernier enregistrement on ne peut pas définir un enregistrement "n+1" tel que la lecture se fait jusque n+1 qui a une valeur nulle et s'arrête justement sur cet enregistrement qui si l'on suit ton code ne serait pas pris en compte et donc l'enregistrement n serait comptabilisé?

De plus, c'est vrai qu'Oracle est très exigeant sur la syntaxe... essaye (si tu ne l'as pas fait) devant tes noms de tables de mettre le nom de la base et un point ('BASE'.'TABLE') avec ou sans les quotes simples ou doubles je ne sais plus vraiment (Oracle remonte à il y a 2 ou 3 ans, au pire tu as 4 syntaxes à tester c'est pas trop la misère...)

Ensuite n'oublie pas de vérifier que tu as le droit du GRANT si tu n'es pas DBA, car si le DBA n'a pas transmis le pouvoir GRANT, tu ne pourras pas affecter de privilèges.

Au "presque-pire" des cas, essaye un script SQL dans un fichier texte qui recense ton code et importe le.

Et dans le pire des cas, bon courage...! :D

Salut!
3
Bonjour,

Le mieux semble être de se faire une petite routine en PL/SQL, qui boucle sur le résultat du SELECT pour appeler un EXECUTE IMMEDIATE avec la commande à faire :

begin
for nomtable in
(SELECT table_name
from all_tables
where owner = 'B'
and table_name LIKE 'PUBLIC_%'
) loop

EXECUTE IMMEDIATE 'grant SELECT, UPDATE, INSERT on ' || nomtable.table_name || ' to A';

end loop;

end;


Ca c'est la forme simple, la forme complexe utilise un curseur pour ouvrir le SELECT et le parcourir. Avec un curseur Oracle ne bugge pas (en version < 9, parfois il ne lit pas lma dernière ligne), mais sinon c'est la même chose.
2