如何通过Bicep为Azure SQL创建额外登录、管理员及数据库用户?
针对Azure SQL IaC部署相关问题的解决方案
1. 设置多个Azure AD管理员
Azure SQL服务器支持同时添加多个Azure AD管理员(含用户和组),无需局限于单个主体。用Bicep配置时,直接在Microsoft.Sql/servers资源的administrators属性中添加多组AD主体信息:
resource sqlServer 'Microsoft.Sql/servers@2023-05-01-preview' = { name: 'your-sql-server-name' location: resourceGroup().location properties: { administratorLogin: '' // 留空,启用AD管理员模式 administratorLoginPassword: '' version: '12.0' } resources: [ resource sqlServerAdmin 'Microsoft.Sql/servers/administrators@2023-05-01-preview' = { name: 'ActiveDirectory' properties: { administratorType: 'ActiveDirectory' login: 'DBA-Team-Group' // DBA组名称 sid: '<DBA-Group-Object-ID>' // 组的Azure AD对象ID tenantId: subscription().tenantId azureADOnlyAuthentication: true // 可选:强制仅AD身份验证 administrators: [ { login: 'Your-User-Name' sid: '<Your-User-Object-ID>' // 你的Azure AD对象ID tenantId: subscription().tenantId } ] } } ] }
注意:
sid需替换为对应AD主体的对象ID,可通过Azure Portal或az ad user show/az ad group show命令获取。
2. 用Bicep自动创建数据库级用户(无需手动登录)
要在部署流程中自动生成数据库用户,可通过Bicep的Microsoft.Sql/servers/databases/extensions资源执行SQL脚本,借助部署身份(如服务主体)的Azure AD权限完成操作,无需手动登录SSMS:
resource sqlDb 'Microsoft.Sql/servers/databases@2023-05-01-preview' = { name: 'your-db-name' parent: sqlServer location: resourceGroup().location properties: { collation: 'SQL_Latin1_General_CP1_CI_AS' } } // 执行SQL脚本创建数据库用户 resource createDbUsers 'Microsoft.Sql/servers/databases/extensions@2021-11-01' = { name: 'CreateDbUsers' parent: sqlDb properties: { type: 'SqlAzureDbScript' settings: { scriptUrl: '<SAS-URL-to-your-SQL-script>' // 存储于Blob存储的SQL脚本SAS链接 sqlAuthenticationType: 'AzureAD' // 使用AD身份验证执行脚本 } } }
对应的SQL脚本示例(创建AD用户并分配权限):
-- 创建开发人员AD用户并赋予读写权限 CREATE USER [Dev-User] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [Dev-User]; ALTER ROLE db_datawriter ADD MEMBER [Dev-User]; -- 创建应用服务主体用户并赋予所有者权限 CREATE USER [App-SP] FROM EXTERNAL PROVIDER; ALTER ROLE db_owner ADD MEMBER [App-SP];
若不想依赖外部存储,也可通过Bicep的loadTextContent函数加载本地SQL脚本,或直接内联简短脚本(注意长度限制)。
3. SQL脚本创建用户的连接账号解决方案
若必须手动执行SQL脚本但无现有管理员权限,可采用以下两种方式解决:
- 临时添加自身为AD管理员:通过Bicep或Azure CLI临时将自己设为服务器管理员,执行脚本后移除:
az sql server ad-admin create --resource-group your-rg --server your-sql-server --display-name "Your Name" --object-id <Your-Object-ID> # 执行SQL脚本后移除管理员权限 az sql server ad-admin delete --resource-group your-rg --server your-sql-server - 使用服务主体执行脚本:创建Azure AD服务主体并赋予
Azure SQL DB Contributor权限,通过sqlcmd用该主体登录执行脚本:sqlcmd -S your-sql-server.database.windows.net -d your-db -G -U <SP-Client-ID> -P <SP-Secret> -i create-users.sql
关键注意事项
- 部署身份(服务主体或操作用户)需具备
Microsoft.Sql/servers/administrators/write权限以设置管理员,以及Microsoft.Sql/servers/databases/extensions/write权限以执行脚本。 - 若启用
azureADOnlyAuthentication,SQL登录将被禁用,所有操作必须通过Azure AD身份验证完成。 - Azure AD类型的数据库用户无需服务器级登录,直接通过
CREATE USER ... FROM EXTERNAL PROVIDER即可关联AD主体。
内容的提问来源于stack exchange,提问作者Don Chambers
相关产品推荐
相关产品推荐

