2009-06-09 6 views
1

Essayer d'exécuter quelques sql dans une procédure pl/sql.Oracle 'identifiant myschema.mytable doit être déclaré'

Sélectionner un champ dans schema.view;

je reçois une erreur de compilation

erreur (22,18): PLS-00201: identifiant « schema.view » doit être déclarée

De l'erreur, il semble que mon utilisateur n'a pas accès à la table. Je peux exécuter la même instruction dans une fenêtre de requête.

Existe-t-il une permission que je dois accorder?

Merci!

Répondre

4

Vous devez accorder à l'utilisateur l'autorisation explicite de la procédure sur la table/vue. L'accorder à travers un rôle ne fonctionnera pas.

Cordialement K

+0

Merci pour votre réponse rapide. – Sam

2

Oui. Oracle ne tient pas compte des autorisations que vous avez sur l'appartenance au rôle lorsque vous exécutez des procédures. Il est donc probable que l'utilisateur qui possède la procédure a reçu l'accès à schema.view via un rôle. Vous devez accorder explicitement des autorisations pour cet objet au propriétaire de la procédure.

+0

Très apprécié! – Sam

1

L'exception PLS-00201 me semble un peu inhabituelle pour le problème des "privilèges accordés via un rôle non disponible dans une procédure stockée". Comme Steve Broberg et KHB ont déjà souligné, d'accorder des privilèges directement à un utilisateur résoudra exception

ORA-00942: table or view does not exist. 

(C'est l'exception que je vois normalement lors de la compilation d'une procédure stockée, lorsque l'instruction fonctionne en dehors de la procédure stockée, et i trouver que les privilèges sont accordés par des rôles.)

Quel est le genre de particulier est que l'exception que vous voyez est un PLS-00201 ( qui m'a intrigué.)


Une autre solution à l'ORA-942 question « aucun privilège par le biais de rôles » est de définir la procédure avec les droits de invocateur et utiliser SQL dynamique:

create procedure foo authid current_user 
is 
    ln_cnt number; 
begin 
    execute immediate 'select cnt(1) from schema.view' into ln_cnt; 
end; 
/

Je ne pense pas que ce soit la meilleure approche (il a son propre problèmes), mais c'est une solution de contournement.

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm

Questions connexes