あるユーザーのテーブルから別のスキーマにデータをコピーするためのストアドプロシージャを作成しています。基本的に、これは一連の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
を挿入しましたが、役に立ちません。
他に何ができますか?私はここで私の考えのほとんど終わりにいます。
プロシージャの所有者には、基になるオブジェクトに直接アクセスする権限を付与する必要があります。 ロール を介さないでください。手順と同じレベルのアクセス権を取得するには、次のコマンドを使用します。
SET ROLE NONE;
プロシージャから別のテーブルにアクセスするには、ロールを介さずに直接SELECTを付与する必要があります。
GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>;
Tom Kyteによるこの記事 追加情報が含まれています。