dba_jobs_running: таблица или представление не существуют при попытке получить доступ из процедуры

Однако, если вы сделаете это, нужно быть осторожным: я бы не рекомендовал использовать статические объекты std :: string, вместо этого используйте static char *. Причина этого связана с потенциальными проблемами с порядком инициализации. Допустим, у вас есть статический экземпляр класса, конструктор которого ссылается на строку A::f1. Нет никакой гарантии, что A::f1 был построен, и вы получите крах, или, что еще хуже, не крах, а поддельные данные.

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

5
задан OMG Ponies 25 March 2011 в 23:24
поделиться

3 ответа

Вам, вероятно, потребуется выполнить прямой GRANT DBA_JOBS_RUNNING пользователю, которому принадлежит процедура. Выполнение GRANT через роль не сработает ... грант должен быть явным.

EDIT:

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

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

GRANT SELECT ON SYS.DBA_JOBS_RUNNING TO <user-that-owns-proc>;
8
ответ дан 18 December 2019 в 14:50
поделиться

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

Роб

1
ответ дан 18 December 2019 в 14:50
поделиться

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

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
4
ответ дан 18 December 2019 в 14:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: