无法为Entra ID用户授权Postgres数据库:警告原因及解决方法
问题背景
已创建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数据库上执行正常。
操作步骤:
- 以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"
- 创建Entra用户/角色:
postgres=> SELECT * FROM pgaadauth_create_principal('myuser@company.com', false, false);
- 执行授权命令时触发上述警告。
问题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没有原生的全局"所有数据库管理员"角色,但可以通过两种方式简化权限管理:
- 创建自定义全局管理角色
在postgres数据库中创建一个拥有超权限的角色,将DbAdmins组加入该角色,后续创建新数据库时指定该角色为所有者:
-- 在postgres数据库执行 CREATE ROLE GlobalDbAdmin WITH SUPERUSER; GRANT GlobalDbAdmin TO "DbAdmins";
创建新数据库时:
CREATE DATABASE "New-Database" OWNER GlobalDbAdmin;
这样DbAdmins组会自动拥有新数据库的全权限,无需再单独授权。
- 利用Azure内置服务器角色
将DbAdmins组添加到Azure Postgres的azure_pg_admin内置角色,该角色拥有服务器级的管理权限,可简化跨数据库的权限操作:
GRANT azure_pg_admin TO "DbAdmins";
不过注意,新创建的数据库仍需手动设置权限,或指定azure_pg_admin为数据库所有者。
内容的提问来源于stack exchange,提问作者Liero

