近期在 PanWeiDB‑V3.0‑S3.5.0 版本做 Schema 与数据表权限分配时,先后遇到两次权限报错,经过实操排查,现已定位全部诱因并且落地解决方案,现将踩坑经验、原理、命令以及注意事项整理如下,方便后续运维参考。
一、第一次故障:已经授予表查询权限,访问数据表提示 schema 权限拒绝
1. 操作经过
使用 omm 超级管理员执行下述语句,授予用户 test2 可以查询 test1 模式下全部数据表,同时配置新建表的默认权限:
GRANT SELECT ON ALL TABLES IN SCHEMA test1 TO test2; ALTER DEFAULT PRIVILEGES IN SCHEMA test1 GRANT SELECT ON TABLES TO test2;切换至 test2 账号执行查询select * from test1.test1;,抛出permission denied for schema test1。
2. 故障根源
磐维数据库权限分为两层独立权限:Schema(模式)准入权限、数据表对象权限。
GRANT SELECT仅管控数据表;- 想要进入架构读取表,用户必须拥有该 Schema 的USAGE权限。
只分配表查询权限并不代表能够访问模式,因此必须单独授权架构访问权限:
GRANT USAGE ON SCHEMA test1 TO test2;授权完成之后 test2 即可正常读取现有数据表 test1。
二、第二次故障:配置默认权限,新建数据表依旧查询报错
1. 操作经过
- 登录 test1 用户,在 test1 模式下新建数据表 test2;
- 使用 test2 访问
select * from test1.test2;,提示permission denied for relation test2。
此前已经执行ALTER DEFAULT PRIVILEGES IN SCHEMA test1 GRANT SELECT ON TABLES TO test2;,预期新建数据表自动分配查询权限,实际并未生效。
2. 核心原理
ALTER DEFAULT PRIVILEGES的生效对象为当前执行这条 SQL 的数据库角色。
本次由 omm 执行默认权限配置,则规则只适用于 omm 后续新建的数据表;
数据库每个角色自带独立的新建对象默认权限策略,test1 创建数据表不会继承 omm 的默认授权规则。
3. 解决办法
语法增加FOR ROLE参数,专门指定建表用户 test1,配置它创建对象时的默认权限:
ALTER DEFAULT PRIVILEGES FOR ROLE test1 IN SCHEMA test1 GRANT SELECT ON TABLES TO test2;配置结束之后,omm、test1 两个账号在 test1 架构下新建数据表,都会自动授予 test2 查询权限。
三、完整标准授权脚本
以后需要让普通用户读取指定 Schema 全部表格时,一次性执行全套语句,规避遗漏:
--1.授予模式进入权限 GRANT USAGE ON SCHEMA test1 TO test2; --2.授予当下已经存在所有数据表的查询权限 GRANT SELECT ON ALL TABLES IN SCHEMA test1 TO test2; --3.超级管理员omm新建表自动授权 ALTER DEFAULT PRIVILEGES IN SCHEMA test1 GRANT SELECT ON TABLES TO test2; --4.业务建表账号test1新建表自动授权 ALTER DEFAULT PRIVILEGES FOR ROLE test1 IN SCHEMA test1 GRANT SELECT ON TABLES TO test2;四、运维排查命令
- 查询 Schema 权限
SELECT grantee, privilege_type FROM information_schema.schema_privileges WHERE schema_name='test1';- 查询全部角色默认对象权限
SELECT * FROM pg_default_acl;查看字段 defaclrole,可以区分不同建表角色对应的默认权限规则。
五、运维经验总结
- Schema USAGE 权限和表权限相互独立,访问表之前必须拥有模式准入权限;
- 默认新建对象权限是按角色隔离,谁执行 alter‑default‑privileges 就给谁配置规则;多账号会在同一个 schema 建表时,需要逐个配置 FOR‑ROLE;
- 快照引用泄漏属于软件提示告警,和权限故障无关,排查权限问题无需优先处理该日志;
- 分区表、子表、视图需要单独授权,普通表授权不会自动同步权限至分区子表。