2012-11-15 93 views
11

我需要使用用户usr1的dbms_lock.sleep过程。我不能以sys身份登录,但我有一个用户usr2的密码,它具有“授予任何对象权限”特权。然而,当我登录的USR2和尝试发出如何在Oracle中为dbms_lock授予执行权限?

grant execute on sys.dbms_lock to usr1 

我得到ORA-01031“权限不足”异常。这同样适用于其他用户的测试包。系统包是专门处理的,还是我错过了一些东西?

+0

Oracle已经[承诺通过在'dbms_session'](https://community.oracle.com/ideas/4852)中加入'sleep'过程来解决这个问题。 –

回答

11

根据初始化参数O7_DICTIONARY_ACCESSIBILITY的值,专门处理系统包。如果这是自Oracle 9i以来的默认值FALSE,那么ANY权限不适用于数据字典。该文件将此称为“字典保护”。

我可以在安全指南中找到最接近的 - herehere - 仅以表格为例。

但是,Oracle支持说明174753.1明确指出字典保护取代grant any object privilege。我不被允许引用,但它解释了你所看到的;如果您有权访问它,可能值得查找。

因此,usr2能够grant execute on sys.dbms_lock to usr1的唯一方法是让DBA完成grant execute on sys.dbms_lock to usr2 with grant option

正如Ben所说,您必须让DBA直接授予usr1的权限,或者将with grant option添加到授予usr2的权限;或者usr2创建一个围绕dbms_lock调用的包装程序,并将权限授予usr1

+0

只是偶然发现了一个[dbms_lock']的包装器[this old answer](http://stackoverflow.com/a/2564566/266304)。 –

4

声音好像SYS还没有被授予DBA角色或SYS没有授予任何对象权限。若要从the documentation

引用授予对象权限,则必须拥有该对象或 对象所有者必须授予您使用GRANT OPTION对象的权限,或者您必须被授予GRANT任何对象特权 系统特权。如果您拥有GRANT ANY OBJECT PRIVILEGE,那么只有当对象所有者可以让 授予相同的对象权限时,您才可以授予对象权限。

这意味着您不能在dbms_lock上授予执行权限,因为SYS不能这样做。

在安装SYS is automatically granted the DBA role所以也许有人一直在改变这个或创建另一个用户与DBA的角色。

无论哪种方式,如果您只能访问这两个用户,就必须让您的DBA参与其中。要求他们将所需的软件包执行许可给需要它的用户。他们可以给你一个很好的理由,为什么他们不会给你执行你需要的软件包来完成你的工作。

如果您无法完全访问dbms_lock,您可以随时在另一个用户中创建一个包含您需要的dbms_lock.sleep的过程,然后单独为该过程授予执行权限。

+2

我看到相同的东西(11gR2);但'SYS'完全可以在'dbms_lock'上授予执行权限,显然必须将其授予'usr2',否则会得到未知的表错误,而不是权限不足。其他软件包也会发生同样的情况,而不仅仅是那一种。尽管我还没有在任何地方发现它,但似乎'SYS'对象具有另一层保护;我想这不是完全不合理的。有趣。 –

+1

我会检查你说的是什么,但我认为用户总是可以将自己的软件包授予任何人,不是吗? –