13

我需要使用用户 usr1 的 dbms_lock.sleep 程序。我无法以 sys 身份登录,但我有用户 usr2 的密码,该密码具有“授予任何对象权限”权限。但是,当我以 usr2 身份登录并尝试发出

grant execute on sys.dbms_lock to usr1

我得到 ORA-01031“权限不足”异常。这同样适用于另一个用户的测试包。系统包是否经过特殊处理,还是我遗漏了什么?

4

2 回答 2

12

根据初始化参数的值,对系统包进行特殊处理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.

于 2012-11-16T10:19:57.063 回答
4

听起来好像 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您需要的过程,然后单独授予对该过程的执行权限。

于 2012-11-15T22:58:43.067 回答