执行REFRESH MATERIALIZED VIEW报错:必须是物化视图的所有者
检查当前会话的有效角色
有时即便用户是物化视图所有者,当前会话也可能未激活对应角色,导致权限检测失败。执行SELECT current_user, session_user, current_roles();查看当前会话的用户和已激活角色。若所有者角色未激活,执行SET ROLE <你的所有者角色名>;后再尝试刷新。确认物化视图的实际所有者
可能存在误判当前用户为所有者的情况,执行SELECT relowner::regrole FROM pg_class WHERE relname = '<物化视图名>' AND relkind = 'm';查看实际所有者,对比是否与current_user一致。若不一致,需将所有权转移给当前用户,或切换到正确的所有者角色操作。排查角色权限继承问题
若物化视图所有者是角色组,当前用户作为组成员可能未继承权限。执行SELECT rolinherit FROM pg_roles WHERE rolname = '<你的角色名>';查看角色的inherit属性。若rolinherit为false,执行ALTER ROLE <你的角色名> INHERIT;修改属性,或显式授予角色给当前用户并激活。检查物化视图所在模式的权限
即便拥有物化视图所有权,若所在模式无足够权限也会触发报错。执行SELECT nspname, usename FROM pg_namespace WHERE nspname = '<模式名>';查看模式所有者,同时执行SELECT * FROM pg_namespace WHERE nspname = '<模式名>' AND has_schema_privilege(current_user, nspname, 'USAGE');检查当前用户对模式的USAGE权限。若无权限,执行GRANT USAGE ON SCHEMA <模式名> TO <你的用户/角色>;授予权限。排查数据库版本bug
部分旧版PostgreSQL(如9.x早期版本)可能存在物化视图权限检测的bug。执行SELECT version();查看当前版本,若为较旧版本,建议升级至稳定版本。
内容的提问来源于stack exchange,提问作者Ralam

