如何用PowerShell备份含加密存储过程的Azure SQL数据库并排除加密对象
解决Azure SQL导出Bacpac时忽略加密存储过程的问题
当然可以实现!问题在于New-AzureRmSqlDatabaseExport(包括新版的New-AzSqlDatabaseExport)Cmdlet并没有直接提供跳过加密对象的参数,不过我们可以直接调用底层的SqlPackage.exe工具(Azure SQL导出/导入的核心工具),它支持忽略加密对象的配置。
具体步骤:
找到SqlPackage.exe的路径
这个工具通常随SQL Server Data Tools (SSDT)或Azure SQL SDK安装,常见路径类似:C:\Program Files\Microsoft SQL Server\150\DAC\bin\SqlPackage.exe版本号(比如
150)可能根据你安装的版本不同有所变化,你可以用PowerShell搜索确认:Get-ChildItem -Path "C:\Program Files\Microsoft SQL Server" -Filter "SqlPackage.exe" -Recurse构造导出命令并调用
使用/p:IgnoreEncryptedObjects=True参数来跳过加密对象,下面是完整的PowerShell示例,替换成你的变量即可:# 替换为你的实际参数 $ResourceGroupName = "你的资源组名称" $ServerName = "你的SQL服务器名称" $DatabaseName = "目标数据库名称" $BacpacUri = "https://你的存储账户.blob.core.windows.net/容器名/备份文件.bacpac" $AdministratorLogin = "SQL管理员账号" $AdministratorLoginPassword = ConvertTo-SecureString "管理员密码" -AsPlainText -Force $SqlPackagePath = "找到的SqlPackage.exe完整路径" # 调用SqlPackage执行导出,忽略加密对象 & $SqlPackagePath ` /a:Export ` /ssn:$ServerName.database.windows.net ` /sdn:$DatabaseName ` /su:$AdministratorLogin ` /sp:$($AdministratorLoginPassword | ConvertFrom-SecureString -AsPlainText) ` /tf:$BacpacUri ` /p:IgnoreEncryptedObjects=True
关键说明:
IgnoreEncryptedObjects=True参数会让工具自动跳过所有加密的数据库对象(包括存储过程、函数等),不会因为这些加密元素导致导出失败。- 由于这些存储过程无法解密,导出的Bacpac文件中不会包含它们,这是目前唯一可行的绕开方式,因为PowerShell的导出Cmdlet没有暴露这个配置项。
内容的提问来源于stack exchange,提问作者user3626232




