Azure PostgreSQL灵活服务器v16.1授予pg_read_all_data权限报错
Azure PostgreSQL灵活服务器v16.1授予pg_read_all_data权限报错问题处理
问题描述
- 使用Azure管理员账号登录v16.1版本的Azure PostgreSQL灵活服务器,执行
GRANT pg_read_all_data to kypdba;命令时触发权限错误:
postgres=> GRANT pg_read_all_data to kypdba; ERROR: permission denied to grant role "pg_read_all_data" DETAIL: Only roles with the ADMIN option on role "pg_read_all_data" may grant this role.
- 授予
pg_read_all_settings角色可成功,但该权限无法满足只读需求 - 相同操作在v14、v15版本中可正常执行,且执行后管理员角色会被自动添加为新建角色的成员
- 未找到官方文档说明此变更,需确认是否为微软有意调整的权限策略
- 连接信息:psql(15.6)连接server16.1,SSL连接状态正常
分析与解决方案
权限变更原因
这是Azure PostgreSQL灵活服务器v16.1的权限模型收紧变更,默认管理员账号不再拥有pg_read_all_data角色的ADMIN选项,因此无法直接将该内置角色授予其他用户。替代实现只读权限的方法
方案一:直接批量授予数据库级只读权限
切换到目标数据库后执行以下命令,覆盖现有及未来新建对象的只读权限:-- 切换到目标数据库 \c your_database_name; -- 授予public schema下所有现有表的SELECT权限 GRANT SELECT ON ALL TABLES IN SCHEMA public TO kypdba; -- 授予public schema下所有现有序列的USAGE和SELECT权限 GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO kypdba; -- 设置默认权限,确保未来新建表自动继承只读权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO kypdba; -- 设置默认权限,确保未来新建序列自动继承权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO kypdba;若存在自定义schema,需替换
public为对应schema名称,重复执行上述命令。方案二:创建自定义只读角色
先创建自定义角色并配置权限,再将角色赋予目标用户:-- 创建自定义只读角色 CREATE ROLE readonly_role; -- 授予public schema下的只读权限 GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_role; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly_role; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly_role; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO readonly_role; -- 将自定义角色授予目标用户 GRANT readonly_role TO kypdba;
确认微软设置意图
目前官方文档未明确提及此变更,但从行为来看属于v16.1版本的权限策略调整。可通过Azure支持工单提交查询,获取官方明确说明。
内容的提问来源于stack exchange,提问作者Am_I_Helpful
相关产品推荐
相关产品推荐

