Почему я не могу предоставить exec для dbms_lock.sleep() ИЛИ создать процедуру, используя ее (но я могу запустить ее самостоятельно)

Я пытаюсь написать небольшой кусочек PL/SQL, в котором находится спящий режим без записи процессора.

Следующие работы в sqldeveloper

begin
  dbms_lock.sleep(5);
end;

НО (как тот же пользователь), я не могу сделать следующее:

create or replace
procedure sleep(seconds in number)
is
begin
  dbms_lock.sleep(seconds);
end;

без ошибки "идентификатор"DBMS_LOCK"должен быть объявлен... Забавно, как я мог запустить его без процедуры.

Странно, но когда я вхожу в систему как администратор базы данных, я могу запустить команду

grant exec on dbms_lock to public;

и я получаю

ERROR at line 1:
ORA-00990: missing or invalid privilege

Это версия оракула "Oracle Database 11g Express Edition, выпуск 11.2.0.2.0 - 64-битная версия"

2 ответа

Решение
[richard@f1 ~]$ sqlplus /nolog 

SQL*Plus: Release 11.2.0.2.0 Production on Fri Sep 14 13:33:18 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

SQL> connect sys@xe as sysdba

Enter password: ******

Connected.
SQL> grant execute on sys.dbms_lock to richard;

Grant succeeded.

Согласно http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9013.htm

GRANT EXECUTE ON "object" TO PUBLIC;

Чтобы создать отдельную процедуру или функцию, либо спецификацию пакета, либо тело, вы должны выполнить следующие предварительные условия:

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

Внимание: для создания без ошибок, то есть для успешной компиляции процедуры или пакета, требуются следующие дополнительные привилегии: владельцу процедуры или пакета должны быть явно предоставлены необходимые объектные привилегии для всех объектов, на которые есть ссылки в теле кода; владелец не может получить необходимые привилегии через роли.

  • Если привилегии владельца процедуры или пакета меняются, процедура должна быть повторно аутентифицирована перед выполнением. Если у владельца процедуры (или пакета) отозвана необходимая привилегия для ссылочного объекта, процедура не может быть выполнена.
Другие вопросы по тегам