2

ユーザー「user」で Oracle 10g データベースに接続しています。DBA_ROLES で選択を実行すると問題なく結果が表示されますが、選択がプロシージャ内にある場合はエラーORA-00942: テーブルまたはビューが存在しません

ユーザーにいくつかの権限がありませんか? SELECT を実行できるのに、プロシージャ内に含めることができないのはなぜですか?

SQL> SELECT COUNT(*) FROM DBA_ROLES;

  COUNT(*)
----------
        18

SQL> CREATE OR REPLACE PROCEDURE tst_role IS 
     v VARCHAR2(100);
BEGIN
        v := '';
        FOR rec IN (SELECT ROLE FROM DBA_ROLES) LOOP
                v := rec.role;
                DBMS_OUTPUT.put_line(v);
        END LOOP;
END;
/
Warning: Procedure created with compilation errors.

SQL> show errors
Errors for PROCEDURE TST_ROLE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/13     PL/SQL: SQL Statement ignored
5/30     PL/SQL: ORA-00942: table or view does not exist
6/3      PL/SQL: Statement ignored
6/8      PLS-00364: loop index variable 'REC' use is invalid
4

1 に答える 1

9

定義者権限のストアド プロシージャ内では、ロールを介して付与された特権にアクセスできません。これは、使用している Oracle ユーザーがDBA_ROLES、直接付与ではなくロールを介してアクセス権を付与されている可能性が高いことを意味します。ほとんどの場合、DBA にアカウントにSELECT ANY DICTIONARY権限を付与するよう依頼できます。

GRANT SELECT ANY DICTIONARY
   TO your_oracle_user

セッションでロールを無効にし、エラーが発生することを確認することで、実際に問題がロールを介して権限が付与されていることを確認できます。もし、あんたが

SQL> set role none;
SQL> SELECT COUNT(*) FROM DBA_ROLES;

同じ ORA-00942 エラーが発生することに賭けます。

于 2013-02-28T16:15:33.030 に答える