为什么我不能授予 dbms_lock.sleep() 的 exec 权限或使用它创建一个过程(但我可以自行运行它)

为什么我不能授予 dbms_lock.sleep() 的 exec 权限或使用它创建一个过程(但我可以自行运行它)

我正在尝试编写一小段具有非 CPU 燃烧睡眠功能的 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”...有趣的是,我可以在不使用程序的情况下运行它。

同样奇怪的是,当我以 DBA 身份登录时,我可以运行命令

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 - 64bit Production”

答案1

[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.

答案2

根据http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9013.htm

GRANT EXECUTE ON "object" TO PUBLIC;

要创建独立的过程或函数,或者包规范或主体,必须满足以下先决条件:

  • 您必须具有 CREATE PROCEDURE 系统权限才能在您的模式中创建过程或包,或者必须具有 CREATE ANY PROCEDURE 系统权限才能在其他用户的模式中创建过程或包。

注意力:要创建且无错误,即成功编译过程或包,需要以下附加权限:过程或包的所有者必须明确被授予代码主体中引用的所有对象的必要对象权限;所有者不能通过角色获得所需的权限。

  • 如果过程或包的所有者的权限发生变化,则在执行过程之前必须重新验证该过程。如果过程(或包)的所有者对引用对象的必要权限被撤销,则无法执行该过程。

相关内容