我需要使用用户usr1的dbms_lock.sleep过程。我无法以sys身份登录,但我有一个用户usr2的密码,该密码具有“grant any object privilege”权限。但是,当我以usr2身份登录并尝试发出
时grant execute on sys.dbms_lock to usr1
我得到了ORA-01031“权限不足”的例外情况。同样适用于另一个用户的测试包。系统包是专门处理的,还是我错过了什么?
答案 0 :(得分:11)
系统包经过特殊处理,具体取决于初始化参数O7_DICTIONARY_ACCESSIBILITY
的值。如果是FALSE
,这是自Oracle 9i以来的默认值,则ANY
权限不适用于数据字典。文档将其称为“词典保护”。
我在安全指南中找到的最接近的地方 - here和here - 仅以表格为例。
但是,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
。
答案 1 :(得分:4)
听起来,好像SYS未被授予DBA角色或SYS没有GRANT ANY OBJECT权限。引用the documentation
要授予对象权限,您必须拥有该对象或其所有者 该对象必须使用GRANT授予您对象权限 选项,或者你必须被授予GRANT ANY OBJECT PRIVILEGE 系统特权。如果你有GRANT ANY OBJECT PRIVILEGE,那么你 只有在对象所有者可以拥有时才能授予对象权限 授予相同的对象权限。
这意味着您无法在dbms_lock
上授予执行权,因为SYS无法执行此操作。
在安装SYS is automatically granted the DBA role时,可能有人一直在更改此设置或创建了具有DBA角色的其他用户。
如果您只能访问这两个用户,那么您将不得不让您的DBA参与其中。要求他们将需要的包授予需要的用户。他们有充分的理由告诉你为什么他们不会授予你执行你所需要的包以执行你的工作。
如果您无法获得对dbms_lock
的完全访问权限,则可以始终在另一个用户创建一个程序,该程序包含您需要的dbms_lock.sleep
,然后单独授予该程序执行权。