【问题标题】:Materialized view "invalidates" when adding constraint添加约束时物化视图“无效”
【发布时间】:2014-12-19 15:32:18
【问题描述】:

我在 Oracle 10.2.0.50 数据库中有一个物化视图,如下所示:

CREATE MATERIALIZED VIEW mv_cis
   NOCACHE
   NOLOGGING
   NOCOMPRESS
   NOPARALLEL
   BUILD IMMEDIATE
   REFRESH FORCE
           ON DEMAND
           WITH PRIMARY KEY AS
   SELECT component_id, ctn, visible_tag, facility,
          SYSTEM, elev, parent, room_number,
          remarks, safety_class, seismic, quality_level
     FROM v_cis;

相当直接的东西。创建此物化视图后,它是有效的并填充了我期望的数据。然后我向它的表添加一个约束,如下所示:

ALTER TABLE mv_cis
   MODIFY ctn CONSTRAINT chk_cis_ctn_null NOT NULL ENABLE VALIDATE;

这按预期工作,表获得了新的约束,世界上一切都很好。

但是,然后我回头查看物化视图,并且(使用 Toad for Oracle 12)它显示无效。查看user_mviews 表可以发现COMPILE_STATE 是NEED_COMPILE,STALENESS 是UNDEFINED。所以我跑了:

ALTER MATERIALIZED VIEW mv_cis COMPILE;

没有变化。奇怪的是,刷新视图仍然有效,但它显示无效让我发疯,即使一切看起来都井井有条,我的测试计划也会失败。那么,我错过了什么?

【问题讨论】:

  • 如果您尝试创建一个具有相同 DDL(不同名称)的新 MV 会发生什么。
  • 同样的事情。创建良好,添加约束后显示无效。
  • 哦,那完全是另一回事。如果我尝试创建 MV “ON PREBUILT TABLE”,它会给我一个“ORA-12060:预建表的形状与定义查询不匹配”,即使列定义完全匹配。
  • 我能问一下为什么你在基表列上没有 NOT NULL 约束,但你在 MV 中需要它吗?
  • 我尝试在 11g 和 10.2.0.4 上重新创建它,但不能。它必须是在非常特定的场景中发生的错误。只能找到一个关于 COMPILATION_ERROR 的错误。

标签: sql oracle materialized-views


【解决方案1】:

我要说的是错误,你应该检查 Metalink 和/或提交 SR。

这里是 11.2 场景。诚然,它很简单。如果你愿意,我可以用你的实际 DDL 试试。

SQL> create table base(id integer primary key, name varchar2(100) not null,
  2  description varchar2(400));

Table created.

SQL> desc base
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 ID                                        NOT NULL NUMBER(38)
 NAME                                      NOT NULL VARCHAR2(100)
 DESCRIPTION                                        VARCHAR2(400)

SQL> create materialized view mv_base build immediate refresh force on demand
  2  with primary key as
  3  select id, name, description from base
  4  ;

Materialized view created.

SQL> desc mv_base
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 ID                                        NOT NULL NUMBER(38)
 NAME                                      NOT NULL VARCHAR2(100)
 DESCRIPTION                                        VARCHAR2(400)

SQL> alter table mv_base modify description constraint chk_not_null not null 
  2  enable validate;

Table altered.

SQL> desc mv_base
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 ID                                        NOT NULL NUMBER(38)
 NAME                                      NOT NULL VARCHAR2(100)
 DESCRIPTION                               NOT NULL VARCHAR2(400)

现在检查是否需要编译。

SQL> select mview_name, compile_state, staleness from user_mviews;

MVIEW_NAME                     COMPILE_STATE       STALENESS
------------------------------ ------------------- -------------------
MV_BASE                        NEEDS_COMPILE       NEEDS_COMPILE

SQL> alter materialized view mv_base compile;

Materialized view altered.

SQL> select mview_name, compile_state, staleness from user_mviews;

MVIEW_NAME                     COMPILE_STATE       STALENESS
------------------------------ ------------------- -------------------
MV_BASE                        VALID               FRESH

【讨论】:

  • 我有其他观点,我在做基本相同的事情,但它们的行为方式不同,我不确定究竟是什么让这个观点变得无效。
  • 我同意你的观点,这就是为什么我认为这可能是一个错误。这不是我第一次看到 MViews。使用高级复制在 9i 和 10.1 中遇到了几个。当然,像 Oracle 的大多数东西一样,通常也有足够的、非显而易见的解释,但如果没有积极的 metalink 访问,我无法对其进行更多研究。
  • @PaoloBergantino 这可能是“当通过角色授予对主表的访问权限时,编译使物化视图无效(文档 ID 781255.1)”。您组织中的某个人必须有权访问 My Oracle Support,让他们为您查找文档。
猜你喜欢
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多