我需要使用用户 usr1 的 dbms_lock.sleep 程序。我无法以 sys 身份登录,但我有用户 usr2 的密码,该密码具有“授予任何对象权限”权限。但是,当我以 usr2 身份登录并尝试发出
grant execute on sys.dbms_lock to usr1
我得到 ORA-01031“权限不足”异常。这同样适用于另一个用户的测试包。系统包是否经过特殊处理,还是我遗漏了什么?
我需要使用用户 usr1 的 dbms_lock.sleep 程序。我无法以 sys 身份登录,但我有用户 usr2 的密码,该密码具有“授予任何对象权限”权限。但是,当我以 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 所说,您必须让 DBAusr1
直接授予权限,或者将权限添加with grant option
到授予的权限usr2
;或者usr2
围绕dbms_lock
调用创建一个包装程序并将其权限授予usr1
.
听起来好像 SYS 没有被授予 DBA 角色,或者 SYS 没有 GRANT ANY OBJECT 权限。从文档中引用
要授予对象权限,您必须拥有该对象,或者该对象的所有者必须已使用 GRANT OPTION 授予您对象权限,或者您必须已被授予 GRANT ANY OBJECT PRIVILEGE 系统权限。如果您有 GRANT ANY OBJECT PRIVILEGE,那么只有当对象所有者可以授予相同的对象权限时,您才能授予对象权限。
这意味着您不能授予执行权限,dbms_lock
因为 SYS 无法这样做。
在安装SYS 时会自动授予 DBA 角色,因此可能有人一直在更改此设置或创建了另一个具有 DBA 角色的用户。
无论哪种方式,如果您只能访问这两个用户,您都必须让您的 DBA 参与进来。要求他们将您需要的包的执行权限授予需要它的用户。他们应该给你一个很好的理由,为什么他们不会授予你执行你需要的包来完成你的工作。
如果您无法获得完全访问权限,dbms_lock
您始终可以在另一个用户中创建一个包含dbms_lock.sleep
您需要的过程,然后单独授予对该过程的执行权限。