当存在Public.Dual时,为什么会出现错误“ ORA-01720:'SYS.DUAL'的授予选项不存在”?

jim*_*mo3 3 oracle oracle11g

我使用的是Oracle 11g,并且我理解第三方授予的问题。

但是,假设user1创建了一个视图“ view1”作为从double中选择'foo'。

然后,我将view1的Select授予user2,并且出现此错误。

但是请注意,视图中的“双”不符合sys.dual的条件,只是双重的。我想用同义词public.dual来考虑,实际使用的“ dual”将是public.dual,而不是sys.dual,因此不应存在第三者问题,因为它是公共的。

而且,如果sys.dual是Oracle在此视图中假设的模式,则人们会认为,鉴于在视图中使用double是常见的,并且将视图特权授予其他用户也很常见-不会有成千上万的用户在报告这个问题?

我确实看到零星的帖子,但是没有真正的解决方案,只是为创建视图的用户创建了另一个double副本,但这对我来说没有意义。谢谢你的帮助。

jim*_*mo3 6

在咨询了我们的dbas之后,问题是11.2.0.4中的Oracle“功能”:

TL; DR版本:从11.0.4版开始,如果View使用Dual,则除了SELECT之外,您不能授予该View其他任何权限。

为什么我们要授予视图而不是选择更多的权限?在我们的案例中,应用程序供应商以如下方式打包更新程序:更新程序的数据库部分会自动为每个新对象(包括视图)的主应用程序模式编写完整的CRUD授予脚本,因为这样做更容易编写脚本。直到11.0.4甲骨文说/强制执行“嘿,您不能那样做”,所有这些都可以正常工作。


完整版本:

(引自Oracle网站https://support.oracle.com/epmos/faces/BugDisplay?parent=DOCUMENT&sourceId=1628033.1&id=17994036

Oracle数据库-企业版-版本11.2.0.4至11.2.0.4 [版本11.2]本文档中的信息适用于任何平台。从11.2.0.3升级到11.2.0.4后,在执行“创建或替换视图”语句时遇到以下错误:ORA-01720:grant选项不存在升级和“创建或替换视图”之前已创建视图工作正常。原因观察到的行为是正确的。替换从某些其他用户表中选择的视图并且满足以下两个条件时,将收到此ORA-1720错误:

  • 您已经向其他用户授予了VIEW的select或其他特权
  • 视图所有者在从中选择的表上没有GRANT选项(或者视图所有者可能具有授予选项的特权,但没有其他特权)。开发人员对此进行了如下解释:

在11.2.0.4中更改了代码,因此创建视图的行为类似于授予。如果您尝试在现有视图上进行GRANT操作,而视图所有者没有授予选项,则ORA-1720是预期的结果(即使在11.2.0.3中也是如此)。在11.2.0.4中,我们仅使CREATE VIEW与GRANT行为保持一致,即,如果存在不兼容的授予,则必须不允许使用新的视图定义(即使使用FORCE)。换句话说,我们不允许不兼容的授予与视图定义共存,因此必须抛出错误。11.2.0.3版(及更早版本)中的行为不正确;11.2.0.4中的新行为是有意且正确的。解决方案为避免此问题,您可以执行以下任一操作:

  1. 替换视图之前,请删除该视图上的所有授予。这将确保不存在不兼容的授权。
  2. 拖放并重新创建视图。删除视图将自动删除所有资助。

参考BUG:17994036-使用ORA-01720升级到11.2.0.4创建或替换失败BUG:18024486-ORA-1720在从11.2.0.3.0升级到11.2.0.4.0之后创建视图时,ORA-1720