1

私が次のことをすれば、すべてがうまくいきます:

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

そして、「exectests」でプロシージャを実行します。次に、スキーマSCOTTにないタイプUSERのオブジェクトSCOTTをキャッチします。

これはなぜですか、どうすれば回避できますか?

ありがとうクリス

4

1 に答える 1

3

Oracleのドキュメントには次のように記載されています。

ストアドプロシージャ、関数、およびdefiners-rightsパッケージでは、ロール(など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
于 2010-12-13T20:22:48.397 に答える