无法编辑Bicep创建的Azure PostgreSQL数据库,权限问题求助
Azure PostgreSQL Flexible Server通过Bicep创建的数据库权限问题
问题描述
我通过Bicep和Github Actions创建了Azure PostgreSQL Flexible Server及数据库mydb。使用Bicep创建数据库时,其所有者为Azure平台完全管理的azuresu角色,而我通过运行部署操作的服务主体账户,以Entra ID认证方式设置了服务器管理员。
遇到以下问题:
- 无法在
mydb中创建新架构和表,尝试用Entra ID管理员账户执行授权语句:
得到错误提示:GRANT ALL PRIVILEGES ON DATABASE mydb TO "GitHub Actions Deployment Account";WARNING: no privileges were granted for "mydb"
- 服务器管理员仅对默认的
postgres或系统数据库有编辑权限,azuresu账户无法被终端用户使用,想知道除默认库外如何正常使用其他数据库。 - 补充:通过SQL语句创建的数据库,创建账户会自动获得管理员权限,但Bicep创建的数据库,部署服务主体账户无管理员权限,只能用SQL作为临时方案,这是否是Bicep的Bug?
解决方案
1. 正确的权限授予方式
直接对数据库授予ALL PRIVILEGES无法生效,因为azuresu是数据库的所有者,需要分步骤授予必要权限:
-- 授予连接数据库的权限 GRANT CONNECT ON DATABASE mydb TO "GitHub Actions Deployment Account"; -- 授予对public架构的全部操作权限 GRANT ALL PRIVILEGES ON SCHEMA public TO "GitHub Actions Deployment Account"; -- 如果需要创建新架构,额外授予创建权限 GRANT CREATE ON DATABASE mydb TO "GitHub Actions Deployment Account";
执行这些语句前,确保已连接到目标服务器(可连接postgres库后执行跨库授权,或直接连接mydb)。
2. 优化Bicep部署后的权限配置
方案一:Github Actions添加后续SQL步骤
在Bicep部署完成的步骤后,新增一个执行SQL脚本的步骤,使用Entra ID管理员账户连接服务器,直接将服务主体账户设置为mydb的所有者:
ALTER DATABASE mydb OWNER TO "GitHub Actions Deployment Account";
这样服务主体账户就能完全掌控mydb,无需分步授权。
方案二:Bicep中嵌入部署脚本
使用Bicep的deploymentScripts资源,在数据库创建完成后自动执行权限配置SQL。示例片段:
resource setDbOwnerScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = { name: 'set-mydb-owner' location: resourceGroup().location kind: 'AzureCLI' properties: { azCliVersion: '2.57.0' scriptContent: ''' az postgres flexible-server execute --name ${serverName} --database postgres --querytext "ALTER DATABASE mydb OWNER TO \\"GitHub Actions Deployment Account\\";" --auth-type AAD ''' cleanupPreference: 'OnSuccess' timeout: 'PT5M' } }
注意替换serverName为你的服务器名称,确保部署脚本的身份有权限执行该SQL。
关于是否是Bicep Bug的说明
这不是Bicep的Bug,而是Azure PostgreSQL Flexible Server的设计行为:
- 通过ARM/Bicep创建数据库时,默认将所有者设为平台管理的
azuresu账户,目的是保证平台能正常执行备份、恢复、维护等管理操作。 - 通过SQL语句创建数据库时,创建者自动成为所有者是PostgreSQL的原生行为,两者创建路径不同,导致权限差异。
内容的提问来源于stack exchange,提问作者Lazer
相关产品推荐
相关产品推荐

