You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助Azure Automation PowerShell Runbook批量执行Azure SQL命令

Azure Automation PowerShell Runbook 批量执行多SQL命令实现方案

网上大部分单条SQL执行的示例属于过度冗余实现,Invoke-SqlCmd本身就支持传入任意长度的多语句SQL脚本,和你本地执行.sql文件的逻辑完全一致,不需要逐命令编写执行代码。

前置准备

  • 进入你的Azure Automation账户的「模块」库,搜索并导入SqlServer模块,选择和你Runbook Runtime版本匹配的稳定版即可,不要用老旧的SQLPS模块,兼容性差。
  • 给Runbook配置的托管身份提前在目标Dev环境Azure SQL库中分配足够权限:至少持有ALTER ANY USER、ALTER ANY ROLE权限,满足创建用户、配置角色的操作需求,优先用AAD托管身份认证,不需要硬编码SQL账号密码。

两种落地方式

方式1:脚本内嵌(适合SQL逻辑短、不常修改的场景)

直接把你本地.sql文件里的全部内容,以here-string的格式写到PowerShell脚本里,一次性提交执行即可:

# 用系统托管身份登录Azure,无需传入凭据
Connect-AzAccount -Identity | Out-Null
# 获取Azure SQL的AAD认证令牌
$sqlToken = (Get-AzAccessToken -ResourceUrl "https://database.windows.net").Token
# 直接粘贴所有需要执行的SQL语句,和本地.sql文件内容完全一致
$fullSqlScript = @"
CREATE USER [dev_service_account] WITH PASSWORD = 'YourSecurePassw0rd!';
ALTER ROLE db_datareader ADD MEMBER [dev_service_account];
ALTER ROLE db_datawriter ADD MEMBER [dev_service_account];
GRANT EXECUTE ON SCHEMA::dbo TO [dev_service_account];
-- 后续任意多的SQL命令都可以直接追加在这里
"@
# 批量执行所有SQL语句
Invoke-SqlCmd -ServerInstance "your-dev-sql.database.windows.net" `
              -Database "your-migrated-db-name" `
              -AccessToken $sqlToken `
              -Query $fullSqlScript `
              -QueryTimeout 300 `
              -ConnectionTimeout 60 `
              -ErrorAction Stop

如果你原脚本里用GO做批分隔(和SSMS里的写法一致),只需要加3行代码做批分割即可,执行效果和本地跑.sql完全一致:

# 按GO分割为独立执行批,忽略大小写、前后空格
$sqlBatches = $fullSqlScript -split '(?im)^\s*GO\s*$' | Where-Object { $_.Trim() }
foreach ($batch in $sqlBatches) {
    Invoke-SqlCmd -ServerInstance "your-dev-sql.database.windows.net" `
                  -Database "your-migrated-db-name" `
                  -AccessToken $sqlToken `
                  -Query $batch `
                  -QueryTimeout 300 `
                  -ErrorAction Stop
}

方式2:复用本地.sql文件(适合SQL逻辑长、需要频繁调整的场景)

不需要把SQL内容硬编码在Runbook代码里,直接把本地.sql文件的内容存到Automation变量资产即可,后续改SQL逻辑不需要动Runbook代码:

  • 打开本地的.sql文件,全选复制全部内容
  • 进入Automation账户的「变量」资产,新建字符串类型变量,命名为PostMigrationSqlScript,值粘贴刚才复制的.sql内容,保存
  • Runbook中直接读取变量执行即可:
Connect-AzAccount -Identity | Out-Null
$sqlToken = (Get-AzAccessToken -ResourceUrl "https://database.windows.net").Token
# 从Automation变量读取完整SQL脚本
$fullSqlScript = Get-AzAutomationVariable -AutomationAccountName "your-auto-account-name" `
                                         -ResourceGroupName "your-resource-group" `
                                         -Name "PostMigrationSqlScript" `
                                         -ErrorAction Stop | Select-Object -ExpandProperty Value
# 后续执行逻辑和方式1完全一致,带GO就分割后逐批执行,不带GO直接提交

常见避坑点

  • 不要用网上老教程里手写SqlCommand逐句执行的方案,代码冗余度极高还容易遇到转义、批处理不兼容的问题,SqlServer模块自带的Invoke-SqlCmd是官方维护的,对Azure SQL兼容性最好。
  • 不要把SQL账号、密码硬编码在脚本里,托管身份+访问令牌的认证方式不需要维护凭据,安全性更高。
  • 跨资源迁移完数据库后,先确认目标库的AAD管理员配置正常,否则托管身份会连库失败。
  • 如果脚本里包含中文、特殊字符,保存Runbook和SQL变量的时候确认编码为UTF-8,避免执行时报语法错误。

内容的提问来源于stack exchange,提问作者MicSmitty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:39:16