Oracle物化视图创建报ORA-00942错误解决

php中文网
发布: 2016-06-07 17:29:21
原创
2063人浏览过

在Oracle 10g的数据库中,将一个物化视图做了一个简单的条件子句修改,删除后重建,但是,就建不成功,报ORA-00942表或视图不存在

在oracle 10g的数据库中,将一个物化视图做了一个简单的条件子句修改,删除后重建,但是,就建不成功,报ora-00942表或视图不存在错误。

 这个问题很奇怪,我首先想这会是一个bug吗?找了oracle的metalink,还真有类似bug记载,,但给出的解决方法不合适。于是去自己分析解决,然后发现一个坑接着一个坑啊。
 
好吧,我先介绍物化视图的创建语句,如下所示:
 CREATE MATERIALIZED VIEW V_TABLENAME
 REFRESH COMPLETE ON DEMAND
 START WITH TO_DATE('28-05-2013 16:55:32', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE + 1
 AS
 SELECT WID AS WID, KCM as KCM, JXBH AS JXBH, KKNF AS KKNF, KKXQM AS KKXQM, XQ AS XQ, JS AS JS, ZS AS ZS, JSGH AS JSGH
 FROM USR_GXSJ.V_TABLENAME@dblink_name
  where
  (KKNF = '2012' AND KKXQM = '1') OR (KKNF = '2012' AND KKXQM = '2');
 
ORA-00942: table or view does not exist
 ORA-06512: at "SYS.DBMS_SNAPSHOT_UTL", line 960
 ORA-06512: at line 1
 
在Oracle的metalink中,一个名为Create Materialized View Results in : Ora-942 [ID 364632.1] 文档是这样解释说它是一个bug。
 
Symptoms
 
Creating a Materialized view based on a view existing on the remote database results in the following errors:
 ORA-00942: table or view does not exist
ORA-06512: at "SYS.DBMS_SNAPSHOT_UTL", line 1543
ORA-02063: preceding 2 lines from remote db

Significantly, the database link on the local side connects to user_c schema on the remote database.
 
On the remote database the configuration is :
 user_a - table owner and Materialized View log owner;
 user_b - has view on a table in user_a's schema : view1
 user_c - has select privs on view in user_b's schema.
 
Changes
 
This issue occurs when the remote database is 10.2.
 The problem did not occur with 9.2.X
 
Cause
 
This issue is addressed in : Bug 5015547.
 
Solution
 
In order to determine that it is this issue, create the database link to user_b schema.
 
This can serve as a workaround and confirmation that this is likely :  Bug 5015547
 
Apply patch for Bug 5015547 to 10.2.0.X if it is thought you are experiencing this issue.
 
在这篇文档中,Oracle提出的解决方法,是将dblink修改成同一访问用户的,这里没去测试,因为这不符合我们的应用架构的规划。
 
没办法了,只好去自己去分析并在网上找找前人的案例。
 
首先,检查一下权限,看看显示授权行不行。将USR_GXSJ.V_TABLENAME的授权,不行,将USR_GXSJ.V_TABLENAME中的表再授权,也不行。
 
后来,在网上发现有一个人给出了这个问题的解决方法,将USR_GXSJ.V_TABLENAME@dblink_name这个数据源用select * from USR_GXSJ.V_TABLENAME@dblink_name做一次嵌套。
 
按照方法测试了一下,居然就可以了。
 
CREATE MATERIALIZED VIEW V_TABLENAME
 REFRESH COMPLETE ON DEMAND
 START WITH TO_DATE('28-05-2013 16:55:32', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE + 1
 AS
 SELECT WID AS WID, KCM as KCM, JXBH AS JXBH, KKNF AS KKNF, KKXQM AS KKXQM, XQ AS XQ, JS AS JS, ZS AS ZS, JSGH AS JSGH
 FROM (select * from  USR_GXSJ.V_TABLENAME@dblink_name)
  where
  (KKNF = '2012' AND KKXQM = '1') OR (KKNF = '2012' AND KKXQM = '2');
 
 这里很悲剧,因为我们没搞懂为什么???
 
后来,发现这还不是最悲剧的,我们在添加工作记录时,顺手翻了以前的记录。
 
去年的记录
 修改视图V_TABLENAME,报错
 ora 00942 table or view does not exist
 ora 06512 at SYS.DBMC_SNAPSHOT_UTL ,line 960
给了dba的权限,还是报一样的错误,想办法。。。。
 。。。。。
 开始说是bug,打了补丁后还是不对。
 使用10046 event分析语句内部执行时遇到的具体错误
 是再校验基础表的主键字段出错。
 我们物化视图脚步中,没有指明是使用rowid还是primary key方式遍历数据。默认使用primary key。
 
根据记录提示,我们增加with rowid子句,创建成功。
 
原来,这个问题以前发生过,我们在一个坑里摔了两次,希望没第三次了。

BlessAI
BlessAI

Bless AI 提供五个独特的功能:每日问候、庆祝问候、祝福、祷告和名言的文本生成和图片生成。

BlessAI 89
查看详情 BlessAI

linux

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号