【发布时间】: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