なぜthsは匿名で機能しますが、手順では機能しませんか?
-
09-10-2019 - |
質問
私が次のことをするならば、すべては問題ありません:
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
所属していません StackOverflow