我需要使用用户usr1的dbms_lock.sleep过程。我无法以sys身份登录,但我有一个用户usr2的密码,该密码具有“grant any object privilege”权限。但是,当我以usr2登录并尝试发布时
grant execute on sys.dbms_lock to usr1
我得到了ORA-01031“权限不足”的例外情况。同样适用于另一个用户的测试包。系统包是专门处理的,还是我错过了什么?
我需要使用用户usr1的dbms_lock.sleep过程。我无法以sys身份登录,但我有一个用户usr2的密码,该密码具有“grant any object privilege”权限。但是,当我以usr2登录并尝试发布时
grant execute on sys.dbms_lock to usr1
我得到了ORA-01031“权限不足”的例外情况。同样适用于另一个用户的测试包。系统包是专门处理的,还是我错过了什么?
系统包经过特殊处理,具体取决于初始化参数的值 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
。
它 声音 好像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
你需要然后单独授予执行该程序。