【问题标题】:getting Oracle materialized view to refresh让 Oracle 物化视图刷新
【发布时间】:2012-07-04 04:08:11
【问题描述】:

我在我的 Java EE 应用程序中发现了 Oracle 数据库中的一个错误:有一个没有正确刷新的物化视图。如果我对 MV 进行查询,它会为我提供坏的外键并且看起来很旧。

那么我该如何修复或替换这个物化视图呢?欢迎任何想法。

我试过手动刷新,像这样:

DBMS_MVIEW.REFRESH('PRODUCTDESCRIPTIONS', 'C');

我收到错误“ORA-00942:表或视图不存在”。我不明白这个,因为当我手动运行 MV 的子查询时,它看起来很好。

Apex网页界面显示MV已经一年多没有刷新了,所以这不是新问题。

我从刷新过程中查找任何日志记录,但找不到文件 refresh.log。

我试过用一个简单的查询来替换物化视图,但是太慢了。我很乐意以某种方式重写/重新配置/重新安装 MV。

数据库和操作系统版本:

Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production

uname -a:
Linux <server name> 2.6.9-78.0.22.ELsmp #1 SMP Thu Apr 30 19:14:39 EDT 2009 i686 i686 i386 GNU/Linux

物化视图的源代码:

CREATE MATERIALIZED VIEW  "PRODUCTDESCRIPTIONS"
  ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" 
  BUILD IMMEDIATE
  USING INDEX 
  REFRESH COMPLETE ON DEMAND
  USING DEFAULT LOCAL ROLLBACK SEGMENT
  DISABLE QUERY REWRITE
  AS SELECT prdcts.primarykey AS product, 
prdcts.upcid AS productupcid, 
prdcts.description AS productdescription, 
prdctctgrs.primarykey AS productcategory, 
prdctctgrs.id AS productcategoryid, 
prdctctgrs.name AS productcategoryname, 
prdctpkgs.primarykey AS productpackage, 
prdctpkgs.name AS productpackagename FROM prdctctgrs, 
prdcts, 
prdctpkgs, 
prdctctgrstoprdcts, 
prdctstoprdctpkgs 
WHERE 
prdctctgrstoprdcts.productcategory = prdctctgrs.primarykey 
AND prdctctgrstoprdcts.product = prdcts.primarykey 
AND prdctstoprdctpkgs.product = prdcts.primarykey 
AND prdctstoprdctpkgs.productpackage = prdctpkgs.primarykey 
AND bitand(prdctctgrs.metaflags, 1)+0 = 0 
AND bitand(prdcts.metaflags, 1)+0 = 0 
AND bitand(prdctpkgs.metaflags, 1)+0 = 0 
AND bitand(prdctctgrstoprdcts.metaflags, 1)+0 = 0 
AND bitand(prdctstoprdctpkgs.metaflags, 1)+0 = 0
/

【问题讨论】:

  • 这似乎可行:从 Apex 记录 SQL,删除 MV,然后从 SQL 重新创建它。 (也将 ON DEMAND 替换为 ON COMMIT。)该 MV 中的某些内容非常混乱,可能是因为数据库是通过从不同环境中的转储文件恢复来创建的。

标签: oracle plsql materialized-views


【解决方案1】:

只是为了确认我对原始问题的评论:删除并重新创建 MV 解决了问题。

【讨论】:

    【解决方案2】:

    当您运行刷新过程时,您是否以您要从中选择的表的所有者身份执行它?您正在访问的所有表是否都直接授予您?如果这些表是通过角色授予您的,那么刷新过程将无法看到它们。

    【讨论】:

    • 我以 Web 应用程序数据库用户的身份运行它,他也是表的所有者。根据 Apex 的说法,这个用户只有一个角色 CONNECT,我怀疑它与表格有关。另一方面,我没有看到对表的特定权限授予;我想我可以在列出的 5 个表上显式授予 SELECT 权限,看看是否有帮助。
    • 如果您以表的所有者身份运行,那么这不是问题。
    猜你喜欢
    • 2012-07-18
    • 2016-06-14
    • 2010-09-27
    • 1970-01-01
    • 2018-04-20
    • 2021-01-13
    • 2017-01-24
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多