Oracle 19c物化视图引用表重命名报ORA-00942 能否不删除重建修复
物化视图替换基表为同义词后失效的修复方案
失效原因
Oracle物化视图在创建时,会将依赖基表的内部唯一标识OBJECT_ID固化存储在SYS.SNAP$、SYS.SNAPREF$等系统数据字典中,不会像普通视图、同义词那样每次访问时动态解析对象名称。你重命名原表后,物化视图仍然指向原表的OBJECT_ID,新建的同名同义词对应的是新的对象ID,因此不会被物化视图识别,这也是同义词可以正常生效、但物化视图仍然失效的核心差异。
无需删除重建的修复方法
方案1:19c及以上版本使用官方语法修改依赖
Oracle 19c新增了MODIFY BASE TABLE语法,可以直接修改物化视图的依赖基表,无需删除重建:
-- 直接修改物化视图的依赖指向为新的同义词(或新表名) ALTER MATERIALIZED VIEW TAB_20211101_MV MODIFY BASE TABLE tab_20211101; -- 操作后执行一次全量刷新,确认可用 BEGIN DBMS_MVIEW.REFRESH('TAB_20211101_MV', 'C'); END; /
注意:该方案要求新的基表(同义词指向的表)结构必须和原基表完全一致,且已创建符合快速刷新要求的物化视图日志。
方案2:19c以下版本的替代方案
19c以下没有官方支持的直接修改依赖的语法,如果你不想手动编写复杂的物化视图创建语句,可以使用数据泵导出导入元数据的方式实现重建,降低出错概率:
-- 导出物化视图元数据 expdp 用户名/密码 directory=自定义目录名 dumpfile=mv_metadata.dmp include=MATERIALIZED_VIEW:\"IN ('TAB_20211101_MV')\" content=METADATA_ONLY -- 删除原有失效物化视图 DROP MATERIALIZED VIEW TAB_20211101_MV; -- 导入元数据,会自动基于当前的同名同义词创建物化视图 impdp 用户名/密码 directory=自定义目录名 dumpfile=mv_metadata.dmp
验证方法
操作完成后执行以下语句确认物化视图状态正常:
SELECT * FROM USER_OBJECTS a WHERE a.OBJECT_NAME like 'TAB_20211101%' AND STATUS = 'INVALID';
如果没有返回结果则说明物化视图已经恢复有效。
内容的提问来源于stack exchange,提问作者user103716
相关产品推荐
相关产品推荐

