如何通过Azure Automation Runbook读取Blob中.sql文件并执行至Azure SQL数据库
解决方案:直接读取Blob内容执行SQL脚本
不用把SQL文件下载到本地存储,PowerShell Runbook可以直接读取Blob里的SQL脚本内容,再传给Invoke-Sqlcmd执行,具体操作步骤如下:
1. 连接存储账户并读取Blob内容
用Az.Storage模块直接获取Blob的文本内容,无需落地文件。示例代码:
# 配置存储账户信息 $storageAccountName = "你的存储账户名" $containerName = "你的容器名" $blobName = "目标SQL文件名,比如test.sql" # 获取存储上下文(如果用托管身份,不用密钥,直接调用Get-AzStorageAccount即可) $storageAccount = Get-AzStorageAccount -ResourceGroupName "你的资源组名" -Name $storageAccountName $ctx = $storageAccount.Context # 把Blob里的SQL脚本读到变量里 $blob = Get-AzStorageBlob -Container $containerName -Blob $blobName -Context $ctx $sqlScript = $blob.ICloudBlob.DownloadText()
2. 直接执行脚本内容
Invoke-Sqlcmd的-Query参数可以直接接收字符串形式的SQL脚本,不需要用依赖本地文件的-InputFile参数。示例代码:
# 配置SQL数据库连接信息 $sqlServer = "你的SQL服务器名.database.windows.net" $sqlDbName = "目标数据库名" $sqlUser = "数据库用户名" $sqlPwd = ConvertTo-SecureString "数据库密码" -AsPlainText -Force $sqlCred = New-Object System.Management.Automation.PSCredential ($sqlUser, $sqlPwd) # 执行SQL脚本 Invoke-Sqlcmd -ServerInstance $sqlServer -Database $sqlDbName -Credential $sqlCred -Query $sqlScript
补充说明
- 如果Runbook用系统托管身份,可以给存储账户和SQL数据库配置对应权限,不用硬编码密钥或密码,安全性更高。
- 要是SQL脚本特别大,
DownloadText可能有内存压力,可以考虑分段读取,但绝大多数场景下直接读变量就够用。 - 别用
-InputFile参数,这个确实需要本地文件路径,无服务器Runbook没有持久化存储,直接传字符串是最省事的方案。
内容的提问来源于stack exchange,提问作者Strayda
相关产品推荐
相关产品推荐

