Oracle 企业版 11.2.0.3
我收到:
ORA-31603: object "string of type "string" not found in schema "string"
执行调用 dbms_metadata.get_ddl 的函数时。
我知道程序/函数必须明确授予权限而不是通过角色授予:https ://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1065832643319
我也知道执行 dbms_metadata.get_ddl 所需的权限在 SELECT_CATALOG_ROLE 角色中:https ://sshailesh.wordpress.com/2010/05/08/dbms_metadata-get_ddl-avoid-ora-31603-error-by-using-选择目录角色/
但是,SELECT_CATALOG_ROLE 角色包含超过 2400 个权限。那么,执行 dbms_metadata.get_ddl 所需的显式权限是什么,以便我可以从函数中调用它?
测试用例:
create or replace function getddl (p_type varchar2, p_object varchar2, p_owner varchar2)
return varchar2 as
begin
return dbms_metadata.get_ddl(p_type, p_object, p_owner);
end getddl;
create table utilities.mytable (mycol varchar2(1));
select dbms_metadata.get_ddl('TABLE', 'MYTABLE', 'UTILITIES') from dual;
<DDL>
select getddl('TABLE', 'MYTABLE', 'UTILITIES') from dual;
ORA-31603: object "MYTABLE" of type TABLE not found in schema "UTILITIES"
编辑
到目前为止,我已明确授予拥有 getddl() 的用户以下内容:
select any table
select any dictionary
根据 Raj 的评论,以下工作:
请检查 docs.oracle.com/database/121/ARPLS/d_metada.htm#ARPLS66868,尤其是关于调用者权限的部分(作为答案添加)。