Назад | Перейти на главную страницу

Почему я не могу предоставить 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 "Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64-битная производственная среда"

В соответствии с http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9013.htm

GRANT EXECUTE ON "object" TO PUBLIC;

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

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

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

  • Если права владельца процедуры или пакета меняются, процедура должна быть повторно аутентифицирована перед выполнением. Если необходимая привилегия для указанного объекта отозвана у владельца процедуры (или пакета), процедура не может быть выполнена.
[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.