質問

私が次のことをするならば、すべては問題ありません:

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には見つかりないタイプユーザーのオブジェクトScottをキャッチします。

なぜこれがそして、どうすれば私は回避できますか?

クリスに感謝します

役に立ちましたか?

解決

オラクル ドキュメンテーション 州:

ストアドプロシージャ、関数、および定義者の右パッケージ、ロール( SELECT_CATALOG_ROLE)無効になっています。したがって、 このようなPL/SQLプログラムは、独自のスキーマのオブジェクトのメタデータのみを取得できます. 。別のスキーマ内のオブジェクトのメタデータを取得するPL/SQLプログラムを作成する場合(招待者の所有に基づいて SELECT_CATALOG_ROLE)、プログラムのInvokers-Rightsを作成する必要があります。

これを行うには、追加する必要があります 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