如何在Oracle中授予dbms_lock的执行权限?

13

我需要使用用户usr1的dbms_lock.sleep过程。我无法以sys身份登录,但我有一个能够拥有“授予任何对象特权”权限的usr2用户密码。然而,当我作为usr2登录并尝试发出命令时

grant execute on sys.dbms_lock to usr1

我遇到了ORA-01031“权限不足”的异常。在另一个用户的测试包中可以正常工作。系统包是否被特别处理,或者是我漏掉了什么?


Oracle已经承诺在未来的版本中通过向dbms_session添加sleep过程来解决此问题。 - William Robertson
2个回答

12
系统包会受到特殊处理,这取决于初始化参数 O7_DICTIONARY_ACCESSIBILITY 的值。如果该值为 FALSE(Oracle 9i默认值),则 ANY 权限不适用于数据字典。文档将此称为“字典保护”。
在安全指南中最接近的例子是herehere,但只涉及表格。
然而,Oracle支持笔记174753.1明确说明字典保护覆盖了授予任何对象权限。如果您有访问权限,可以查阅该笔记以了解详细信息。

因此,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 授予权限。


刚刚偶然发现了这个旧答案,它展示了一个dbms_lock的包装器。 - Alex Poole

4
听起来好像 SYS 没有被授予 DBA 角色,或者 SYS 没有 GRANT ANY OBJECT 特权。引用自文档
要授予对象特权,必须拥有该对象,或者该对象的所有者必须使用 GRANT OPTION 授予您对象特权,或者必须已被授予 GRANT ANY OBJECT PRIVILEGE 系统特权。如果您拥有 GRANT ANY OBJECT PRIVILEGE,则只能在对象所有者可以授予相同对象特权的情况下授予对象特权。
这意味着您无法授予对 dbms_lock 的执行权限,因为 SYS 无法这样做。
在安装SYS 自动被授予 DBA 角色,因此可能有人更改了这一点或创建了另一个具有 DBA 角色的用户。
无论如何,如果你只能访问这两个用户,那么你都需要让数据库管理员参与其中。请他们向需要使用它的用户授予所需的包的执行权限。他们必须给出一个充分的理由,说明为什么不会授予你执行所需包的权限,以便你完成工作。
如果无法完全访问dbms_lock,您可以在另一个用户中创建一个过程,该过程包装了您需要的dbms_lock.sleep,然后仅授予对该过程的执行权限。

2
我在11gR2中看到了同样的事情;但是SYS绝对可以授予dbms_lock的执行权限,显然必须授予usr2,否则会出现未知表错误而不是权限不足。其他包也会发生同样的情况,而不仅仅是这一个。虽然我还没有在任何地方找到它的文档,但似乎SYS对象有另一层保护;这似乎并不完全不合理。有趣。 - Alex Poole
1
我会检查你所说的,但我认为用户总是可以授予任何人对他自己的包的执行权限,不是吗? - Tomasz Żuk
抱歉,但这个答案完全是错误的。如果grant execute on sys.dbms_lock to usr1,那么看起来不是SYS有问题,而是用户usr1有问题。因此,你的假设是错误的,结论也就毫无用处了。在这个问题的另一个答案中,解释了这是数据库的预期行为。 - miracle173

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接