如果我做以下操作,一切都很好:

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

但是,如果我将其包裹在一个过程中:

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

并通过“ Exec Tests”执行该过程;然后,我捕获了Schema Scott中未找到的类型用户的对象。

为什么这个,我如何四处走动?

谢谢克里斯

有帮助吗?

解决方案

Oracle 文档 状态:

在存储过程,功能和定义者权利包中,角色(例如 SELECT_CATALOG_ROLE)被禁用。所以, 这样的PL/SQL程序只能在其自己的架构中获取对象的元数据. 。如果您想编写一个PL/SQL程序,该程序在其他模式中获取元数据(根据调用者的拥有 SELECT_CATALOG_ROLE),您必须使程序调用权利。

为此,您必须添加 authid 执行您的程序。

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top