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

无法为Entra ID用户授权Postgres数据库:警告原因及解决方法

Azure Postgres Flexible Server Entra ID用户权限配置问题解答

问题背景

已创建Azure Database for Postgres Flexible Server,将DbAdmins组设为Microsoft Entra管理员,需在CD流程中自动添加Entra ID用户作为My-Database的受限普通用户。可以通过pgaadauth_create_principal或CREATE USER成功创建用户,但执行授权命令时触发警告:

WARNING: no privileges were granted for "My-Database"
该命令在postgres数据库上执行正常。

操作步骤:

  1. 以Entra管理员身份连接到postgres数据库:
psql "host=myserver.postgres.database.azure.com port=5432 dbname=postgres user=DbAdmins password='$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)' sslmode=require"
  1. 创建Entra用户/角色:
postgres=> SELECT * FROM pgaadauth_create_principal('myuser@company.com', false, false);
  1. 执行授权命令时触发上述警告。

问题1:为何出现权限授予警告?

PostgreSQL中,执行GRANT操作的主体必须拥有目标数据库的授予权限(GRANT OPTION),或者是该数据库的所有者。Azure默认仅为Entra管理员分配postgres数据库的全权限,自定义创建的My-Database并不会自动给Entra管理员授予权限,因此当你在postgres数据库中尝试给My-Database的用户授权时,由于当前账号对My-Database没有足够权限,就会触发该警告。

问题2:如何为新添加的Entra用户授予数据库权限?

有两种可行方案:

方案1:直接连接到目标数据库执行授权

先使用Entra管理员账号连接到My-Database(首次连接可能需要密码管理员先给DbAdmins组授予该数据库的连接权限),再执行授权:

# 连接到My-Database
psql "host=myserver.postgres.database.azure.com port=5432 dbname=My-Database user=DbAdmins password='$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)' sslmode=require"
-- 授予连接权限
GRANT CONNECT ON DATABASE "My-Database" TO "myuser@company.com";
-- 根据业务需求授予其他权限,比如查询表权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "myuser@company.com";

方案2:先给DbAdmins组分配目标数据库的授权权限

使用本地密码管理员账号连接到My-Database,执行以下命令给DbAdmins组授予全权限及转授权能力:

GRANT ALL ON DATABASE "My-Database" TO "DbAdmins" WITH GRANT OPTION;

之后再用DbAdmins组账号连接到任意数据库,即可给My-Database的用户执行授权操作。

补充问题:是否存在无需为每个数据库执行授权命令的角色?

PostgreSQL没有原生的全局"所有数据库管理员"角色,但可以通过两种方式简化权限管理:

  1. 创建自定义全局管理角色
    在postgres数据库中创建一个拥有超权限的角色,将DbAdmins组加入该角色,后续创建新数据库时指定该角色为所有者:
-- 在postgres数据库执行
CREATE ROLE GlobalDbAdmin WITH SUPERUSER;
GRANT GlobalDbAdmin TO "DbAdmins";

创建新数据库时:

CREATE DATABASE "New-Database" OWNER GlobalDbAdmin;

这样DbAdmins组会自动拥有新数据库的全权限,无需再单独授权。

  1. 利用Azure内置服务器角色
    将DbAdmins组添加到Azure Postgres的azure_pg_admin内置角色,该角色拥有服务器级的管理权限,可简化跨数据库的权限操作:
GRANT azure_pg_admin TO "DbAdmins";

不过注意,新创建的数据库仍需手动设置权限,或指定azure_pg_admin为数据库所有者。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:24:54