如何通过Azure门户CLI连接Azure托管实例执行DDL脚本?
解决Azure托管实例(MI)连接失败并执行SQL脚本的方案
一、先排查核心连接障碍
- 确认网络可达性:Azure MI部署在专属VNet内,执行脚本的环境(Azure门户Cloud Shell、本地机器、DevOps代理)必须处于MI的VNet/对等VNet中,或通过VPN/Express Route建立连接。若使用Azure门户Cloud Shell,需将其所在子网加入MI的VNet,或开启MI的公共端点(注意配置安全规则)。
- 验证防火墙规则:在Azure门户的MI资源页,进入「防火墙和虚拟网络」设置,确认允许当前客户端IP访问(公共端点场景),或VNet内访问权限已启用。
- 核对实例地址与端口:MI的标准连接格式为
Server=tcp:<mi-name>.public.<region>.database.windows.net,3342;Database=<db-name>;...,公共端点固定用3342端口,私有端点使用1433端口,需确保地址和端口无错误。
二、使用Azure CLI连接并执行SQL脚本
Azure CLI提供原生的az sql mi execute命令,无需额外依赖,适合快速操作:
# 登录Azure(未登录时执行) az login # 直接执行单条SQL查询 az sql mi execute --name <mi-name> --resource-group <rg-name> --database <db-name> --query-text "SELECT * FROM db.schema.table" # 执行本地SQL脚本文件 az sql mi execute --name <mi-name> --resource-group <rg-name> --database <db-name> --file-path ./your-script.sql
三、PowerShell正确连接方式(修复invoke-SQLCMD失败问题)
1. SQL认证方式
$connectionString = "Server=tcp:<mi-name>.public.<region>.database.windows.net,3342;Database=<db-name>;User ID=<sql-login>;Password=<sql-password>;Encrypt=True;TrustServerCertificate=False;" Invoke-SqlCmd -ConnectionString $connectionString -Query "SELECT * FROM db.schema.table"
2. Azure AD认证(推荐用于DevOps流水线)
密码认证
$connectionString = "Server=tcp:<mi-name>.public.<region>.database.windows.net,3342;Database=<db-name>;Authentication=Active Directory Password;User ID=<aad-user>;Password=<aad-pass>;Encrypt=True;TrustServerCertificate=False;" Invoke-SqlCmd -ConnectionString $connectionString -Query "SELECT * FROM db.schema.table"
服务主体认证(流水线无交互场景)
$tenantId = "<tenant-id>" $clientId = "<sp-client-id>" $clientSecret = "<sp-secret>" $connectionString = "Server=tcp:<mi-name>.public.<region>.database.windows.net,3342;Database=<db-name>;Authentication=Active Directory Service Principal;User ID=$clientId;Password=$clientSecret;Encrypt=True;TrustServerCertificate=False;" Invoke-SqlCmd -ConnectionString $connectionString -Query "SELECT * FROM db.schema.table"
四、Azure DevOps流水线适配方案
1. Azure CLI任务方案
- task: AzureCLI@2 inputs: azureSubscription: '<你的Azure服务连接>' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az sql mi execute --name <mi-name> --resource-group <rg-name> --database <db-name> --query-text "SELECT * FROM db.schema.table"
2. PowerShell+服务主体方案
先确保服务主体拥有MI目标数据库的对应权限(如db_datareader),再配置流水线任务:
- task: PowerShell@2 inputs: targetType: 'inline' script: | $connectionString = "Server=tcp:<mi-name>.public.<region>.database.windows.net,3342;Database=<db-name>;Authentication=Active Directory Service Principal;User ID=$(ServicePrincipalId);Password=$(ServicePrincipalKey);Encrypt=True;TrustServerCertificate=False;" Invoke-SqlCmd -ConnectionString $connectionString -Query "SELECT * FROM db.schema.table" env: ServicePrincipalId: $(ServicePrincipalId) ServicePrincipalKey: $(ServicePrincipalKey)
注:需在DevOps变量库中配置服务主体的ID和密钥作为保密变量。
内容的提问来源于stack exchange,提问作者SQLCurious
相关产品推荐
相关产品推荐

