Oracle 19C创建快速刷新物化视图遇ORA-00942错误求助
ORA-12018/ORA-00942 创建快速刷新物化视图报错的原因与解决办法
问题场景
在Oracle 19C环境中,Schema B持有CREATE TABLE和CREATE MATERIALIZED VIEW权限,执行普通物化视图创建语句可成功:
create materialized view matview_info build immediate refresh on demand as select * from a.info;
但添加自动快速刷新配置后重新创建时触发错误:
CREATE MATERIALIZED VIEW matview_info BUILD IMMEDIATE REFRESH FAST START WITH (SYSDATE) NEXT ((SYSDATE) + 3/24) WITH ROWID ON DEMAND DISABLE QUERY REWRITE AS SELECT * FROM a.info;
错误信息:
[Error] Execution (16: 25): ORA-12018: following error encountered during code generation for "B"."MATVIEW_INFO"
ORA-00942: table or view does not exist
已知前置条件:
- Schema B可正常执行
SELECT * FROM a.info返回数据 - Schema A已授予B对
a.info的SELECT和REFERENCES权限 - 基表
a.info已创建物化视图日志
原因分析
快速刷新物化视图在生成底层刷新代码时,Oracle会以**递归用户(SYS)**的身份访问基表及其物化视图日志,而非仅依赖当前Schema B的权限。即使B拥有直接访问a.info的权限,递归调用环节中SYS没有访问A模式下对象的权限,就会触发ORA-00942错误。
解决办法
方法1:授予SYS访问基表的权限(推荐,最小权限原则)
以Schema A身份执行,直接授予SYS对基表的SELECT权限:
GRANT SELECT ON a.info TO SYS;
若需要更规范的权限管理,可创建专用角色:
-- 以DBA身份创建角色 CREATE ROLE MV_REFRESH_ROLE; -- 以Schema A身份将基表权限授予角色 GRANT SELECT ON a.info TO MV_REFRESH_ROLE; -- 授予角色给SYS和Schema B GRANT MV_REFRESH_ROLE TO SYS; GRANT MV_REFRESH_ROLE TO B;
方法2:确保物化视图日志的访问权限
检查基表的物化视图日志(默认命名为MLOG$_<基表名>),确保Schema B对其有SELECT权限:
-- 以Schema A身份执行 GRANT SELECT ON MLOG$_info TO B;
方法3:授予Schema B全局查询权限(不推荐,权限过大)
若上述方式无法实施,可临时授予BSELECT ANY TABLE权限,但会扩大权限范围,需谨慎使用:
GRANT SELECT ANY TABLE TO B;
内容的提问来源于stack exchange,提问作者SeanGaff
相关产品推荐
相关产品推荐

