Pourquoi cela fonctionne en anonyme mais pas dans une procédure?
-
09-10-2019 - |
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
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 deSELECT_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