问题描述
在我们的一个框架脚本中,我们对应用程序中不同产品区域的某些视图执行撤销操作,这些视图已经被授予。在那里,我们注意到,如果视图由于某种原因无效,则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以这种方式处理是否有任何特殊原因,或者是否存在可能的错误?
我们在简单的问题是:
无法从角色撤销对无效视图的授予。
测试用例 :( 不是确切的测试用例,而是一个简单的用例,可以完全表达相同的问题)
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中选择 *;
警告: 使用编译错误创建的视图。
<代码>
<代码>
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。