2010-12-13 6 views
1

私は次の操作を行う場合は、すべてが正常である:thsは匿名では動作しますが、プロシージャで動作しないのはなぜですか?

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

をANDでプロシージャを実行「実行テスト;」 SCOTTスキーマで見つからないタイプのUSERというオブジェクトSCOTTを捕捉します。

なぜこれが問題ですか?どのように回避できますか?

おかげ クリス

答えて

3

オラクルDocumentation状態:ストアドプロシージャ、関数、および 定義者権限パッケージで

、役割(SELECT_CATALOG_ROLEなど )が無効になっています。 したがって、このようなPL/SQLプログラムは、 自身のスキーマにあるオブジェクトのメタデータのみをフェッチすることができます( )。あなたは( SELECT_CATALOG_ROLEの実行者の所有物に基づいて)異なるスキーマ 内のオブジェクトのメタデータをフェッチ PL/SQLプログラムを作成したい場合は、 プログラム呼び出し側-権利をしなければなりません。

これを行うには、あなたの手順に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 
+0

ああ、ありがとう! – chris

関連する問題