Question

Si je fais ce qui suit, tout va bien:

declare
  l_foo clob;
begin
select
regexp_replace(
  dbms_metadata.get_ddl('USER', 'SCOTT', null) ||
  dbms_metadata.GET_GRANTED_DDL ('SYSTEM_GRANT', 'SCOTT') ||
  dbms_metadata.GET_GRANTED_DDL ('OBJECT_GRANT', 'SCOTT') ||
  dbms_metadata.GET_GRANTED_DDL ('ROLE_GRANT', 'SCOTT')
,'"' || chr(10), '";' || chr(10)) 
into l_foo 
from dual;
end;
/

Mais si j'enveloppe ceci dans une procédure:

create procedure tests is
  l_foo clob;
begin
select
regexp_replace(
  dbms_metadata.get_ddl('USER', 'SCOTT', null) ||
  dbms_metadata.GET_GRANTED_DDL ('SYSTEM_GRANT', 'SCOTT') ||
  dbms_metadata.GET_GRANTED_DDL ('OBJECT_GRANT', 'SCOTT') ||
  dbms_metadata.GET_GRANTED_DDL ('ROLE_GRANT', 'SCOTT')
,'"' || chr(10), '";' || chr(10)) 
into l_foo 
from dual;
end;
/

Et exécuter la procédure par "EXEC Tests"; Ensuite, j'attrape un objet Scott de l'utilisateur de type non trouvé dans Schema Scott.

Pourquoi est-ce et comment me déplacer?

Merci Chris

Était-ce utile?

La solution

Oracle Documentation États:

Dans les procédures, fonctions et packages de droits définis stockés, rôles (tels que SELECT_CATALOG_ROLE) sont désactivés. Par conséquent, Un tel programme PL / SQL ne peut récupérer que des métadonnées pour les objets dans son propre schéma. Si vous souhaitez écrire un programme PL / SQL qui récupère les métadonnées pour les objets dans un schéma différent (basé sur la possession de l'invocateur de SELECT_CATALOG_ROLE), vous devez faire les droits des invocateurs du programme.

Pour ce faire, vous devez ajouter authid à votre procédure.

create procedure tests authid CURRENT_USER is
  l_foo clob;
begin
select
regexp_replace(
  dbms_metadata.get_ddl('USER', 'SCOTT', null) ||
  dbms_metadata.GET_GRANTED_DDL ('SYSTEM_GRANT', 'SCOTT') ||
  dbms_metadata.GET_GRANTED_DDL ('OBJECT_GRANT', 'SCOTT') ||
  dbms_metadata.GET_GRANTED_DDL ('ROLE_GRANT', 'SCOTT')
,'"' || chr(10), '";' || chr(10)) 
into l_foo 
from dual;
end;
/

SQL> EXEC tests 

PL/SQL procedure successfully completed
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top