6

プロシージャを作成する場合:

CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS IS
BEGIN
    SYS.DBMS_STATS.GATHER_TABLE_STATS( 'SchName', 'TableName', CASCADE => TRUE);
END;

そしてそれを実行します。

EXEC SchameB.PRC_GATHER_STATS;

これは私にエラーを与えますORA-20000: Unable to analyze TABLE "SchameA"."TableName", insufficient privileges or does not exist。しかし、これは機能します:

EXEC SYS.DBMS_STATS.GATHER_TABLE_STATS( 'SchameA', 'TableName', CASCADE => TRUE);

プロシージャとテーブルのユーザーEXECは異なるスキーマにあります。

プロシージャを介してこれを実行するとエラーが発生するのはなぜですか?

4

2 に答える 2

9

ANALYZE ANY別のスキーマのオブジェクトに関する統計を収集するには、システム権限が必要です。あなたの手順を実行するユーザーにはその権限がありますが、役割を通じて付与されているようです。ドキュメントが言うように:

定義者の権限で実行される名前付きPL/SQLブロック(ストアド・プロシージャ、ファンクションまたはトリガー)では、すべてのロールが無効になります。

GRANT ANALYZE ANYユーザーに直接送信するか、次のように実行者権限でプロシージャを作成できます

CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS
AUTHID CURRENT_USER IS
BEGIN
    SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName', 'TableName', CASCADE => TRUE);
END;
/

プロシージャを直接実行EXECするDBMS_STATSと、匿名ブロックとして実行され、それらは常に実行者の権限で実行されます-ロールを尊重します。

于 2013-01-31T12:03:09.873 に答える
3

ANALYSE ANYロールのないユーザーがプロシージャを実行できるようにする場合は、を次のように設定できAUTHIDます。DEFINER

CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS
AUTHID DEFINER IS
BEGIN
    SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName', 'TableName', CASCADE => TRUE);
END;
于 2014-09-18T23:04:46.043 に答える