我在使用Oracle 11 g,我确实理解第三方授权的问题。
但是,假设user 1创建了一个视图“view 1”作为Select 'foo' from dual。
然后,我将Select on view 1授予user 2,并得到此错误。
但是请注意,视图中的“dual”并不限定为sys.dual,它只是dual。我认为使用同义词public.dual,实际使用的“dual”应该是public.dual,而不是sys.dual,因此不应该存在第三方问题,因为它是公共的。
如果sys.dual是Oracle在这个视图中假设的,人们会认为,鉴于在视图中使用dual是很常见的,并且向其他用户授予视图的权限也很常见--难道成千上万的用户不会报告这个问题吗?
我确实看到了关于这个问题的零星帖子,但除了为创建视图的用户创建另一个dual副本之外,没有真实的的解决方案,但这对我来说没有意义。谢谢你的帮助
3条答案
按热度按时间m1m5dgzv1#
在咨询我们的数据库管理员后,问题是11.2.0.4中的Oracle“特性”:
TL;DR版本:从v11.0.4开始,如果你的View使用Dual,那么你不能授予这个View除SELECT之外的任何权限。
为什么我们要授予比“选择”更多的视图?在我们的例子中,应用程序供应商以这样一种方式打包了他们的更新,即更新的数据库部分自动脚本化完整的CRUD赠款给每个新对象上的主应用程序模式,这包括视图,因为这样更容易编写脚本。这一切都很好,直到11.0.4,当甲骨文说/强制“嘿,你不能这样做”。
完整版本:
(引用自Oracle站点https://support.oracle.com/epmos/faces/BugDisplay?parent=DOCUMENT&sourceId=1628033.1&id=17994036)
Oracle Database - Enterprise Edition -版本11.2.0.4至11.2.0.4 [版本11.2]本文档中的信息适用于任何平台。症状从www.example.com升级到11.2.0.311.2.0.4后,在执行“create or replace view”语句时遇到以下错误:ORA-01720:grant option does not exist视图是在升级之前创建的,并且“CREATE OR REPLACE VIEW”工作正常。原因观察到的行为是正确的。当REPLACEN一个从其他用户的表中进行选择的视图并且以下两个条件都为真时,您将得到此ORA-1720错误:
www.example.com中的代码已更改11.2.0.4,因此创建视图的行为与grant类似。如果您尝试在现有视图上进行GRANT,而视图所有者没有grant选项,则ORA-1720是预期的结果(即使在www.example.com中11.2.0.3)11.2.0.4。如果存在不兼容的授权,则必须不允许新的视图定义(即使使用FORCE)。换句话说,我们不允许不兼容的赠款与视图定义共存,因此必须抛出错误。发布11.2.0.3(及更早版本)中的行为不正确; www.example.com中的新行为11.2.0.4是有意的且正确的。要避免此问题,您可以执行以下操作之一:
1.在替换视图之前删除视图上的所有赠款。这将确保不存在不兼容的赠款。
1.删除并重新创建视图。删除视图将自动删除所有赠款。
参考错误:17994036 -发布升级到11.2.0.4创建或替换ORA-01720错误:18024486 - ORA-1720创建视图时出现故障,之后从11.2.0.3.0升级到11.2.0.4.0
wr98u20j2#
使用sys(as sysdba)数据库用户授予必要的权限,然后尝试使用sys(as sysdba)数据库用户重新创建视图。这对我很有帮助。
问候,花瓶Tusevski
j2qf4p5b3#
作为一个类似的问题,我需要创建一个基于公共表表达式查询的OracleVIEW,该查询涉及SYS.USER_OBJECTS和(SYS.)DUAL。当SQL单独工作时,当嵌入到**CREATE OR REPLACE VIEW ...**中时,我从这个线程的前面得到了消息。
我的回答是:
1.定义一个与我的结果集匹配的ObjectTYPE(只有1列,但大概这不是限制)
1.基于对象类型定义表类型
1.创建一个TABLE函数来遍历正在工作的SQL的结果集,并创建一个结果TABLE。
1.重新创建原始视图以针对功能进行选择。我还没有解决这个问题,那么用户就可以被赋予对视图的适当的SELECT权限。他们可能还需要函数上的EXECUTE特权和TYPE对象上的天知道的特权。
所以 (当然,YMWV由于网站特定的表的东西在这里…)
字符串
这确实给予了我想要的视野