Perché funziona in anonimo ma non in una procedura?
-
09-10-2019 - |
Domanda
Se faccio quanto segue, va tutto bene:
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;
/
Ma se lo avvolgo in una procedura:
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;
/
Ed eseguire la procedura tramite "Exec Test;" Quindi prendo un oggetto Scott di tipo utente non trovato nello schema Scott.
Perché questo e come mi muovo?
Grazie Chris
Soluzione
Oracolo Documentazione stati:
Nelle procedure memorizzate, funzioni e pacchetti di diritti definitivi, ruoli (come ad esempio
SELECT_CATALOG_ROLE
) sono disabilitati. Perciò, Tale programma PL/SQL può recuperare solo metadati per gli oggetti nel proprio schema. Se vuoi scrivere un programma PL/SQL che recupera i metadati per gli oggetti in uno schema diverso (in base al possesso di Invocatore diSELECT_CATALOG_ROLE
), è necessario effettuare i diritti dei programmi del programma.
Per fare questo, devi aggiungere authid
alla tua procedura.
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