物化视图尤其是快速刷新的物化视图,依赖于物化视图日志表,所以物化视图日志表被删除后报错是很正常的,不过如果物化视图日志表是直接被DROP,则错误信息比较有意思。
直接看例子:
SQL> create table t (id number primary key, name varchar2(30));
表已创建。
SQL> create materialized view log on t;
实体化视图日志已创建。
SQL> create materialized view mv_t refresh fast as select * from t;
实体化视图已创建。
SQL> drop materialized view mv_t;
实体化视图已删除。
SQL> drop table mlog$_t;
表已删除。
SQL> create materialized view mv_t refresh fast as select * from t;
create materialized view mv_t refresh fast as select * from t
*
第 1 行出现错误:
ORA-23412: 主表的主键列已更改
SQL> create materialized view mv_t as select * from t;
create materialized view mv_t as select * from t
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> drop materialized view log on t;
实体化视图日志已删除。
SQL> create materialized view mv_t refresh fast as select * from t;
create materialized view mv_t refresh fast as select * from t
*
第 1 行出现错误:
ORA-23413: 表 "TEST"."T" 不带实体化视图日志
SQL> create materialized view mv_t as select * from t;
实体化视图已创建。
SQL> drop materialized view mv_t;
实体化视图已删除。
SQL> create materialized view log on t;
实体化视图日志已创建。
SQL> drop table mlog$_t purge;
表已删除。
SQL> create materialized view mv_t refresh fast as select * from t;
create materialized view mv_t refresh fast as select * from t
*
第 1 行出现错误:
ORA-23412: 主表的主键列已更改
SQL> create materialized view mv_t as select * from t;
create materialized view mv_t as select * from t
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> drop materialized view log on t;
实体化视图日志已删除。
物化视图日志的清除必须使用DROP MATERIALIZED VIEW LOG ON的语法,如果直接删除了物化视图日志对应的表,就会导致上面的错误信息。有趣的是,建立快速刷新的物化视图错误是ORA-23412,而建立完全刷新或FORCE刷新的物化视图会报错ORA-942。
而对于没有建立物化视图日志的基表,则快速刷新的物化视图会报错ORA-23413,而完全刷新或FORCE刷新的物化视图则不会报错。
如果Oracle可以禁止直接删除物化视图日志表,就不会带来这种令人迷惑的错误信息了