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

È stato utile?

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 di SELECT_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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top