为什么THS在匿名中工作,而不是在程序中工作?
-
09-10-2019 - |
题
如果我做以下操作,一切都很好:
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
不隶属于 StackOverflow