dba_jobs_running: таблица или представление не существует при попытке доступа из процедуры - PullRequest
5 голосов
/ 09 июня 2009

Просто запрашивая запущенные задания, используя что-то вроде

select * from dba_jobs_running;

отлично работает, когда выполняется в моей консоли SQL sqldevelopers.

Однако, это не работает, когда в процедуре используется одно и то же утверждение. Компиляция завершается с

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

Есть идеи? Есть ли что-то вроде сферы, которую нужно рассмотреть?

Любые предложения высоко ценятся, заранее спасибо:)

Ответы [ 3 ]

8 голосов
/ 09 июня 2009

Возможно, вам необходимо выполнить прямое ПРЕДОСТАВЛЕНИЕ DBA_JOBS_RUNNING пользователю, которому принадлежит процедура. Выполнение GRANT через роль не сработает .... Грант должен быть явным.

EDIT:

Выполнение SELECT изнутри процедуры требует слегка отличающихся разрешений для выполнения SELECT извне процедуры (например, в SQL-Developer). Пользователю, которому принадлежит процедура, должны быть явно предоставлены права на таблицу или представление ... если при выполнении запроса извне представления это не так (вы можете получить разрешение через роль, например)

Вам необходимо подключиться как SYS и перейти:

GRANT SELECT ON SYS.DBA_JOBS_RUNNING TO <user-that-owns-proc>;
4 голосов
/ 09 июня 2009

Процедуры выполняются без ролей. Один из способов проверить, можно ли выполнить команду в процедуре, - выполнить:

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

Вы должны предоставить select на просмотр непосредственно пользователю:

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
1 голос
/ 09 июня 2009

Является ли процедура принадлежащей другому пользователю? Если это так, посмотрите на: Права Определителя и Invoker для хранимых подпрограмм в руководстве по PL / SQL.

Rob

...