Warum funktioniert das in anonymem, aber nicht in einem Verfahren?
-
09-10-2019 - |
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
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 holtSELECT_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