Frage

Wenn ich Folgendes mache, ist alles in Ordnung:

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;
/

Aber wenn ich dies in eine Prozedur einpasse:

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;
/

Und führen Sie die Prozedur durch "Exec -Tests" aus; Dann fange ich ein Objekt Scott vom Typ Benutzer, der nicht in Schema Scott gefunden wurde.

Warum ist das und wie komme ich herum?

Danke Chris

War es hilfreich?

Lösung

Orakel Dokumentation Zustände:

In gespeicherten Verfahren, Funktionen und Definers-Rechten-Paketen, Rollen (wie z. SELECT_CATALOG_ROLE) sind behindert. Deswegen, Ein solches PL/SQL -Programm kann nur Metadaten für Objekte in seinem eigenen Schema abrufen. Wenn Sie ein PL/SQL -Programm schreiben möchten, das Metadaten für Objekte in einem anderen Schema holt SELECT_CATALOG_ROLE), Sie müssen das Programm in die Rechtsrechte aufrufen.

Dazu müssen Sie hinzufügen authid zu Ihrem Verfahren.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top