PostgreSQL中如何为所有新创建视图授予默认读写权限?
解决方案:实现read_write角色成员默认拥有新创建视图的权限
完全可行,有两种常用方式实现,具体如下:
1. 为视图设置默认权限
和你给表配置默认权限的逻辑一致,只需把对象类型从TABLES改为VIEWS即可,执行以下SQL语句:
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON VIEWS TO read_write;
注意:这条语句仅对执行该命令的用户后续创建的视图生效。如果需要覆盖所有可能创建视图的用户,可切换到每个创建者账号下执行,或用超级用户身份添加
FOR ROLE <创建者角色/用户>指定目标创建者:ALTER DEFAULT PRIVILEGES FOR ROLE 创建者用户名 IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON VIEWS TO read_write;比如要让所有属于
read_write角色的用户创建的视图自动开放权限,可执行:ALTER DEFAULT PRIVILEGES FOR ROLE read_write IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON VIEWS TO read_write;
2. 让新视图默认归read_write角色所有
如果希望视图所有权直接属于read_write(等同于你手动执行ALTER VIEW ... OWNER TO read_write的效果),可通过以下方式实现:
- 为单个用户设置默认角色:
该用户每次连接数据库后,默认以ALTER USER 用户名 SET ROLE read_write;read_write角色操作,创建的视图所有权直接归属read_write,其成员自然继承权限。 - 临时切换角色创建视图:
用户可在创建视图前执行以下语句,临时切换角色:SET ROLE read_write; CREATE VIEW public.xxx AS ...; RESET ROLE;
注意事项
- 视图的
INSERT/UPDATE/DELETE权限生效的前提是视图本身可更新(比如未使用聚合函数、符合PostgreSQL可更新视图规则),否则即使授予权限也无法执行写操作。 - 默认权限不会对已创建的视图生效,之前的视图需手动补授权或修改所有权:
-- 批量补授权 GRANT SELECT, INSERT, UPDATE, DELETE ON ALL VIEWS IN SCHEMA public TO read_write; -- 修改单个视图所有权 ALTER VIEW public.视图名 OWNER TO read_write;
内容的提问来源于stack exchange,提问作者ummon
相关产品推荐
相关产品推荐

