暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 无法从角色撤销对无效视图的授予

askTom 2017-03-21
275

问题描述

在我们的一个框架脚本中,我们对应用程序中不同产品区域的某些视图执行撤销操作,这些视图已经被授予。在那里,我们注意到,如果视图由于某种原因无效,则revoke操作会出错。

我们在简单的问题是:
无法从角色撤销对无效视图的授予。

测试用例 :( 不是确切的测试用例,而是一个简单的用例,可以完全表达相同的问题)
1.创建视图MIDDLE_VIEW
-CREATE OR REPLACE VIEW MIDDLE_VIEW AS SELECT 1 as ONE FROM DUAL;

2.使用MIDDLE_VIEW创建视图FINAL_VIEW
-CREATE OR REPLACE VIEW FINAL_VIEW AS SELECT 1 as ONE FROM MIDDLE_VIEW;

3.创建角色MY_ROLE
-CREATE ROLE MY_ROLE;

4.将最终视图授予我的角色
-GRANT SELECT ON FINAL_VIEW TO MY_ROLE;

5.删除MIDDLE_VIEW,以便FINAL_VIEW变得无效
-DROP VIEW MIDDLE_VIEW;

6.现在尝试从MY_ROLE撤销FINAL_VIEW
-REVOKE SELECT ON FINAL_VIEW FROM MY_ROLE;
引发以下错误:
ORA-04063: 视图 “FINAL_VIEW” 有错误


从系统中选择对象名称、对象id、对象类型、最后ddl时间、状态、临时。用户对象
其中对象名称 = “最终视图”;

对象 _ 名称对象 _ id对象 _ 类型最后一次 _ ddl _ 时间状态临时
---------------------------------------------------------------------
最终视图1439956视图3/21/2017 2:13:23 PM无效N


从系统中选择 *。角色 _ 标签 _ 私人
其中角色 = “我的角色”;

角色所有者表名称列名称特权可授予通用
我的角色IFSAPP最终视图选择否

根据上述查询,此时,Oracle对象FINAL_VIEW都存在 (即使它是无效的),并且其对角色MY_ROLE的授予也存在。

所以我想知道为什么Oracle错误在这里是无效的与撤销操作无关。相反,它应该撤销赠款。

在我们的应用程序中,在这个撤销操作的时候,作为框架,我们不可能找到无效的原因或使观点有效,因此这对我们来说是一个真正的问题。

Oracle以这种方式处理是否有任何特殊原因,或者是否存在可能的错误?

专家解答

就是这样。要使revoke正常工作,可以暂时将视图创建为任何有效的SQL,然后使用FORCE选项将定义放回去,例如

<代码>
SQL> create table t ( x int );

创建的表。

SQL> 创建或替换
2将V视为从T中选择 *;

视图创建。

SQL>
SQL> 授予选择on V到scott;

格兰特成功了。

SQL>
SQL> drop表T清除;

表掉了。

SQL>
SQL> 从scott撤销V上的选择;
从斯科特撤销V上的选择
*
第1行的错误:
ORA-04063: 查看 “MCDONA C.V” 有错误


SQL>
SQL> 创建或替换
2将V视为从dual中选择1 x;

视图创建。

SQL>
SQL> 从scott撤销V上的选择;

撤销成功。

SQL>
SQL> 创建或替换
2强制视图V为从T中选择 *;

警告: 使用编译错误创建的视图。

<代码>

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论