禁用存储账户密钥后,New-AzSqlDatabaseImport不支持Entra ID,如何导入bacpac?
替代
New-AzSqlDatabaseImport导入BACPAC的可行方案 以下是在存储账户仅允许Entra ID+RBAC访问时,导入testdb.bacpac到Azure SQL数据库的几种可行方案:
方案1:使用Azure CLI的az sql db import命令
Azure CLI的该命令支持Entra ID身份认证,无需存储账户密钥。
- 前提:Azure DevOps流水线的服务主体需具备以下权限:
- 存储账户的存储Blob数据读取者角色(用于访问BACPAC文件)
- Azure SQL服务器的SQL DB Contributor或等效权限(用于创建数据库)
- 示例命令:
az sql db import \ --resource-group <你的资源组名称> \ --server <你的SQL服务器名称> \ --name <新测试数据库名称> \ --storage-uri https://<存储账户名>.blob.core.windows.net/<容器名>/testdb.bacpac \ --admin-user <SQL管理员用户名> \ --admin-password <SQL管理员密码> \ --storage-key-type AzureAD - 优势:直接替换原PowerShell命令,无需额外工具,配置简单。
方案2:使用SQLPackage工具(DacFx)
SQLPackage是微软官方的数据库部署工具,支持多种Entra ID认证方式,需先将BACPAC下载到流水线代理本地再导入。
步骤:
- 下载BACPAC到代理:用支持Entra ID的工具(如AzCopy或Azure CLI)从存储账户下载文件
# AzCopy示例(自动使用当前Entra身份) azcopy copy "https://<存储账户名>.blob.core.windows.net/<容器名>/testdb.bacpac" "./testdb.bacpac" - 执行导入:使用SQLPackage命令导入到Azure SQL
服务主体认证示例:# 系统托管身份认证示例(适用于流水线启用托管身份的场景) sqlpackage /Action:Import \ /SourceFile:"./testdb.bacpac" \ /TargetServerName:"<SQL服务器名>.database.windows.net" \ /TargetDatabaseName:"<新测试数据库名称>" \ /Authentication:ActiveDirectoryManagedIdentitysqlpackage /Action:Import \ /SourceFile:"./testdb.bacpac" \ /TargetServerName:"<SQL服务器名>.database.windows.net" \ /TargetDatabaseName:"<新测试数据库名称>" \ /Authentication:ActiveDirectoryServicePrincipal \ /TargetUser:<服务主体客户端ID> \ /TargetPassword:<服务主体密钥>
- 优势:提供丰富的导入配置选项(如调整数据库大小、索引优化等),适合复杂场景。
方案3:通过Azure Data Factory (ADF) 流水线封装导入逻辑
将BACPAC导入逻辑封装到ADF流水线中,Azure DevOps仅触发执行,适合企业级自动化流程。
- 配置步骤:
- 在ADF中创建存储账户链接服务,使用Entra ID(托管身份/服务主体)认证
- 创建Azure SQL链接服务,同样使用Entra ID认证
- 新建流水线,添加「Azure SQL数据库导入」活动,配置存储账户的BACPAC路径、目标SQL数据库信息
- 在Azure DevOps流水线中添加「Azure Data Factory 流水线」任务,触发ADF流水线执行
- 优势:导入逻辑可视化,可与其他数据流程集成,便于监控和维护。
方案4:调用Azure REST API实现导入
通过Entra ID获取访问令牌后,调用Azure SQL的导入API,适合高度自定义的集成场景。
步骤:
- 获取Entra ID访问令牌
az account get-access-token --resource https://management.azure.com --query accessToken -o tsv - 发送POST请求到导入API:
POST https://management.azure.com/subscriptions/<订阅ID>/resourceGroups/<资源组名>/providers/Microsoft.Sql/servers/<SQL服务器名>/databases/<新数据库名>/import?api-version=2021-11-01 Authorization: Bearer <你的访问令牌> Content-Type: application/json { "properties": { "storageKeyType": "AzureAD", "storageUri": "https://<存储账户名>.blob.core.windows.net/<容器名>/testdb.bacpac", "administratorLogin": "<SQL管理员用户名>", "administratorLoginPassword": "<SQL管理员密码>", "databaseName": "<新测试数据库名称>", "edition": "GeneralPurpose", "serviceObjectiveName": "GP_Gen5_2" } }
- 优势:完全自定义导入流程,适合嵌入到复杂的自动化系统中。
内容的提问来源于stack exchange,提问作者blueberry buckwheat
相关产品推荐
相关产品推荐

