Oracle 'идентификатор myschema.mytable должен быть объявлен' - PullRequest
1 голос
/ 09 июня 2009

Попытка запустить какой-нибудь sql в процедуре pl / sql.

Выберите поле из schema.view;

Я получаю ошибку компиляции

Ошибка (22,18): PLS-00201: идентификатор 'schema.view' должен быть объявлен

Из-за ошибки кажется, что у моего пользователя нет доступа к таблице. Я могу запустить тот же оператор в окне запроса.

Есть ли разрешение, которое мне нужно дать?

Спасибо!

Ответы [ 3 ]

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

Необходимо предоставить пользователю, выполняющему процедуру, явное разрешение на таблицу / представление. Предоставление его через роль не будет работать.

С уважением K

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

Да. Oracle не учитывает ваши права доступа к членству в роли при выполнении процедур, поэтому, вероятно, пользователю, которому принадлежит процедура, был предоставлен доступ к schema.view через роль. Вы должны явно предоставить разрешения для этого объекта владельцу процедуры.

1 голос
/ 09 июня 2009

Исключение PLS-00201 мне кажется немного необычным из-за проблемы «привилегии, предоставленные ролью, недоступной в хранимой процедуре». Как уже отмечали Стив Броберг и Кхб, предоставление привилегий напрямую пользователю разрешит исключение

ORA-00942: table or view does not exist.

(Это исключение, которое я обычно вижу при компиляции хранимой процедуры, когда оператор работает вне хранимой процедуры, и я считаю, что привилегии предоставляются через роли.)

Что-то особенное в том, что вы видите исключение PLS-00201 (Это меня озадачило).


Другим обходным решением проблемы «без привилегий через роли» в ORA-942 является определение процедуры с правами активатора и использование динамического SQL:

create procedure foo authid current_user
is
  ln_cnt number;
begin
  execute immediate 'select cnt(1) from schema.view' into ln_cnt;
end;
/

Я не думаю, что это лучший подход (у него есть свои проблемы), но это обходной путь.

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...