Azure SQL bacpac因存储过程含特殊字符导出失败 跨租户迁移求方案
解决方案汇总
优先推荐方案:调整SSMS导出DAC的校验规则
这是处理同类问题亲测有效的方案:
- 不要使用Azure Portal自带的数据库导出功能,改用SQL Server Management Studio(SSMS)连接源Azure GOV租户的数据库
- 右键数据库选择任务→导出数据层应用程序,按引导走到「高级设置」页
- 勾选「忽略验证错误」选项后再导出bacpac文件,出现报错的核心原因是Azure原生导出的校验规则对特殊字符的判定过于严格,你的存储过程本身语法完全合法,跳过校验后导出的文件可正常使用
- 直接将导出的bacpac导入到标准Azure租户的目标SQL Server实例即可,不需要额外调整存储过程内容
替代方案1:生成T-SQL脚本+数据同步
适合不希望用bacpac导入导出的场景:
- 右键源数据库选择任务→生成脚本,高级设置中选择导出所有对象的架构脚本,你已经验证过存储过程脚本可独立运行,生成的架构脚本直接在目标库执行即可完成所有非数据对象的迁移
- 数据同步可根据库大小选择:小库直接在生成脚本时选择导出「架构和数据」,大库用
bcp命令行工具批量导出导入表数据即可
替代方案2:用Azure Data Factory全量同步
适合中大型生产库无停机迁移需求:
- 在标准Azure租户中创建ADF实例,分别配置源(Azure GOV SQL库)和目标(标准Azure SQL库)的连接服务
- 用ADF自带的SQL Server数据同步能力直接同步全量架构+数据,ADF的连接器会直接从数据库引擎拉取元数据,不会触发Portal导出的特殊字符校验逻辑,全程不需要手动调整存储过程内容
我之前处理过存储过程包含$、/、自定义转义符的同类迁移问题,用上述第一个方案10分钟就完成了迁移,比删除存储过程再恢复的流程要稳妥很多,也不会有遗漏存储过程的风险。
内容的提问来源于stack exchange,提问作者BaronVonKumpf
相关产品推荐
相关产品推荐

