17

あるユーザーのテーブルから別のスキーマにデータをコピーするためのストアドプロシージャを作成しています。基本的に、これは一連のINSERT..SELECTステートメントです。

INSERT INTO GESCHAEFTE
  SELECT *
    FROM TURAT03.GESCHAEFTE
   WHERE kong_nr = 1234;

これは、sqlplus(または私にとってはTOAD;-))から発行する場合は正常に機能するため、十分な特権があることはわかっていますが、これが次のようなストアドプロシージャの一部である場合:

CREATE OR REPLACE FUNCTION COPY_KONG
    (pKongNr IN NUMBER)
    RETURN NUMBER
    AUTHID CURRENT_USER
IS
BEGIN
   INSERT INTO GESCHAEFTE
      SELECT *
       FROM TURAT03.GESCHAEFTE
       WHERE kong_nr = pKongNr;
END;

Oracleエラーが発生します:

[Error] ORA-00942 (11: 22): PL/SQL: ORA-00942: table or view does not exist

ご覧のとおり、私はすでにを挿入しましたAUTHIDが、役に立ちません。

他に何ができますか?私はここで私の考えのほとんど終わりにいます。

4

1 に答える 1

28

プロシージャの所有者には、 role を介してではなく、基礎となるオブジェクトに直接アクセスする権限が付与されている必要があります。手順と同じレベルのアクセス権を持つには、次のコマンドを使用します。

SET ROLE NONE;

プロシージャから別のテーブルにアクセスするには、ロールではなく直接 SELECT を付与する必要があります。

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>;

Tom Kyte によるこの記事には、追加情報が含まれています。

于 2010-12-09T14:59:53.753 に答える