5

次のようなものを使用して実行中のジョブをクエリするだけです

select * from dba_jobs_running;

sqldevelopersSQLコンソールで実行すると正常に動作します。

ただし、プロシージャ内にまったく同じステートメントがある場合は機能しません。コンパイルが失敗する

PL/SQL: ORA-00942: table or view does not exist

何か案は?考慮すべきスコープのようなものはありますか?

事前に感謝します、どんな提案も大歓迎です:)

4

3 に答える 3

8

おそらく、プロシージャを所有するユーザーに対して DBA_JOBS_RUNNING の直接 GRANT を実行する必要があります。ロールを介して GRANT を実行しても機能しません....付与は明示的である必要があります。

編集:

プロシージャ内から SELECT を実行するには、プロシージャの外部 (SQL 開発者など) から SELECT を実行する場合とは微妙に異なる権限が必要です。プロシージャを所有するユーザーには、テーブルまたはビューに対する権限が明示的に付与されている必要があります...ビューの外部からクエリを実行する場合、これは当てはまりません (たとえば、ロールを介して権限を付与できます)

SYSとして接続して移動する必要があります:

GRANT SELECT ON SYS.DBA_JOBS_RUNNING TO <user-that-owns-proc>;
于 2009-06-09T08:40:15.900 に答える
5

プロシージャはロールなしで実行されます。プロシージャでコマンドを実行できるかどうかを確認する 1 つの方法は、次を実行することです。

SQL> set role none;

Role set

手順と同じ一連の権利が与えられます。

SQL> SELECT * FROM dba_jobs_running;

SELECT * FROM dba_jobs_running

ORA-00942: table or view does not exist

ビューの選択をユーザーに直接許可する必要があります。

SQL> -- with dba account
SQL> grant select on dba_jobs_running to a;

Grant succeeded

その後、プロシージャをコンパイルできます。

SQL> -- with application schema
SQL> CREATE OR REPLACE PROCEDURE test_dba AS
  2  BEGIN
  3     FOR cc IN (SELECT * FROM dba_jobs_running) LOOP
  4        NULL;
  5     END LOOP;
  6  END test_dba;
  7  /

Procedure created
于 2009-06-09T09:47:49.260 に答える
1

プロシージャは別のユーザーが所有していますか?その場合は、PL/SQLマニュアルの「ストアドルーチンの定義者および呼び出し元の権限」を参照してください。

ロブ

于 2009-06-09T08:33:51.983 に答える