You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Postgres弹性服务器AD管理员执行GRANT权限失败求助

解决Azure Postgres弹性服务器中AD服务主体执行DbUp迁移的权限问题

问题场景

在Azure Postgres弹性服务器中配置了AD管理员,并将一个服务主体(ServicePrincipal)设为服务器级AD管理员,期望通过DbUp完成以下迁移操作:

  • 创建新角色
  • 向新创建的角色授予权限

执行迁移时出现ServicePrincipal无权限访问public.schemaversions的错误,尝试手动执行授权语句:

ALTER SCHEMA public OWNER TO <service principal name>;
GRANT USAGE ON SCHEMA public TO <service principal name>;
GRANT SELECT, INSERT ON public.schemaversions TO <service principal name>;

并通过psql连接:

psql "sslmode=require host=<server> port=<port> dbname=MyDatabase" -U <service principal name> -w

却收到以下报错:

ERROR: permission denied for database MyDatabase
GRANT: ERROR: permission denied for table schemaversions

目前该服务主体仅能连接服务器、创建角色,无法执行GRANT等操作。


核心原因

Azure Postgres的服务器级AD管理员默认仅拥有服务器级的创建角色、管理登录权限,并不会自动获得目标数据库的连接、使用以及对象操作权限,必须显式通过超级权限账号为其补充数据库及对象级权限。


解决方案步骤

1. 使用超级权限账号连接目标数据库

通过默认的postgres用户(或其他具备数据库超级权限的账号)连接到MyDatabase,示例psql命令:

psql "sslmode=require host=<server> port=<port> dbname=MyDatabase" -U postgres -w

2. 授予服务主体数据库级基础权限

执行以下SQL,赋予服务主体连接、使用数据库的权限:

GRANT CONNECT ON DATABASE MyDatabase TO "<service principal name>";
GRANT USAGE ON SCHEMA public TO "<service principal name>";

3. 授予schemaversions表的操作权限

针对DbUp依赖的schemaversions表,赋予必要的读写权限:

GRANT SELECT, INSERT, UPDATE, DELETE ON public.schemaversions TO "<service principal name>";

4. 补充角色管理相关权限(按需)

若服务主体需要创建新角色并为其授权,需额外执行:

-- 允许创建新角色
GRANT CREATE ROLE TO "<service principal name>";
-- 允许将public schema的权限授予其他角色(若迁移脚本包含此类操作)
GRANT GRANT OPTION ON SCHEMA public TO "<service principal name>";

关键注意事项

  • 服务主体名称需用双引号包裹,避免名称中的特殊字符导致识别错误。
  • 服务器级AD管理员权限≠数据库超级用户权限,必须显式授权才能操作数据库内的对象。
  • 完成权限配置后,重新用服务主体账号连接数据库,即可正常执行DbUp迁移脚本。

内容的提问来源于stack exchange,提问作者bomortensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:37:13