web-dev-qa-db-ja.com

Oracleストアドプロシージャ内の別のユーザーのテーブルへのアクセス

あるユーザーのテーブルから別のスキーマにデータをコピーするためのストアドプロシージャを作成しています。基本的に、これは一連の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を挿入しましたが、役に立ちません。

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

15
Thorsten

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

SET ROLE NONE;

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

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>;

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

28
Vincent Malgrat