SQL Data Migration Assistant生成部署脚本失败:触发器引用DELETED伪表报错
问题原因
这个错误大概率是Data Migration Assistant(DMA)的解析bug——DELETED是SQL Server/Azure SQL触发器中内置的伪表,并非用户定义的表或默认约束,但DMA错误地将其识别为需要预先存在的数据库对象,从而抛出“不存在”的错误。Azure SQL本身完全支持触发器及DELETED/INSERTED伪表,核心问题出在DMA的脚本生成逻辑上。
临时解决办法
手动提取触发器脚本单独部署
从源SQL Server数据库直接导出该Delete触发器的T-SQL脚本,跳过DMA的自动脚本生成环节,在Azure SQL数据库部署完成后,手动执行触发器脚本完成创建。注意确保脚本无Azure SQL不支持的旧版T-SQL特性。临时修改触发器代码规避解析问题
临时修改源数据库中的触发器,给DELETED伪表添加别名,例如:-- 原代码 SELECT ColumnName FROM DELETED -- 修改后 SELECT ColumnName FROM DELETED AS DEL重新运行DMA生成部署脚本,迁移完成后再将触发器改回原代码。
升级DMA到最新版本
这类解析类bug通常会在后续版本中修复,检查并安装最新版Data Migration Assistant后重试。更换迁移工具
如果上述方法无效,可尝试使用Azure Database Migration Service(DMS)或SQL Server Management Studio(SSMS)的“部署数据库到Azure SQL”功能,这些工具对触发器伪表的解析逻辑可能更准确。
关于是否为DMA bug的确认
若升级到最新版DMA后问题仍存在,基本可以确定是DMA的解析bug,可通过微软官方反馈渠道提交该问题,推动官方修复。
内容的提问来源于stack exchange,提问作者PatrickNolan

