问题 如何在Oracle中为dbms_lock授予执行权限?


我需要使用用户usr1的dbms_lock.sleep过程。我无法以sys身份登录,但我有一个用户usr2的密码,该密码具有“grant any object privilege”权限。但是,当我以usr2登录并尝试发布时

grant execute on sys.dbms_lock to usr1

我得到了ORA-01031“权限不足”的例外情况。同样适用于另一个用户的测试包。系统包是专门处理的,还是我错过了什么?


5321
2017-11-15 18:07


起源

甲骨文有 承诺在未来的版本中通过添加一个来解决这个问题 sleep 程序 dbms_session。 - William Robertson


答案:


系统包经过特殊处理,具体取决于初始化参数的值 O7_DICTIONARY_ACCESSIBILITY。如果那样的话 FALSE,那是Oracle 9i以来的默认设置 ANY 权限不适用于数据字典。文档将此称为“字典保护”。

我能在安全指南中找到最接近的 - 这里 和 这里  - 仅以表格为例。

但是,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


11
2017-11-16 10:19



偶然发现了 这个老答案它显示了一个包装 dbms_lock。 - Alex Poole


声音 好像SYS没有被授予DBA角色或者SYS没有GRANT ANY OBJECT特权。引用 文件

要授予对象权限,您必须拥有该对象或其所有者   该对象必须已授予您GRANT的对象权限   选项,或者你必须被授予GRANT ANY OBJECT PRIVILEGE   系统特权。如果你有GRANT ANY OBJECT PRIVILEGE,那么你   只有在对象所有者可以拥有时才能授予对象权限   授予相同的对象权限。

这意味着您无法授予执行权限 dbms_lock 因为SYS无法做到这一点。

在安装 SYS自动被授予DBA角色 所以也许某人一直在改变这个或者创建了另一个具有DBA角色的用户。

无论哪种方式,如果您只能访问这两个用户,您将不得不让您的DBA参与其中。要求他们将需要的包授予需要的用户。他们有充分的理由告诉你为什么他们不会授予你执行你所需要的包以执行你的工作。

如果您无法完全访问 dbms_lock 您总是可以在另一个包装的用户中创建一个过程 dbms_lock.sleep 你需要然后单独授予执行该程序。


4
2017-11-15 22:58



我看到同样的事情(11gR2);但 SYS 绝对可以授予执行权 dbms_lock,显然必须授予它 usr2 或者获得未知的表错误而不是权限不足。其他包也会发生同样的事情,而不仅仅是那个。虽然我还没有在任何地方找到它,但它看起来确实如此 SYS 物体有另一层保护;我想这并非完全不合理。有趣。 - Alex Poole
我会检查你说的是什么,但我认为用户可以随时将执行权交给任何人,不是吗? - Tomasz Żuk