Oracle Enterprise 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 /
ただし、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のコメントに基づくと、次のように動作します。
create or replace function utilities.getddl (p_type varchar2, p_object varchar2, p_owner varchar2)
authid current_user
return varchar2 as
begin
return dbms_metadata.get_ddl(p_type, p_object, p_owner);
end getddl;
select getddl('TABLE', 'MYTABLE', 'UTILITIES') from dual;
<DDL>
Docs.Oracle.com/database/121/ARPLS/d_metada.htm#ARPLS66868を確認してください。特に、(回答として追加された)呼び出し権限に関する部分を確認してください。