Visual Studio数据库项目发布报数据丢失错误,待删除列全为NULL值
问题现状
该场景下的误报问题目前没有微软官方的修复公告或针对性优化更新。现有数据丢失校验的设计逻辑仅识别「待操作的表存在数据」和「执行删除列操作」两个条件,不会额外扫描待删除列的实际值是否全为NULL,因此只要对有数据的表执行删列操作,都会默认触发如下报错:RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127)
针对性解决方案(无需关闭全局数据丢失校验规则)
- 预部署脚本定向处理待删列
在数据库项目中添加预部署脚本,写入判断逻辑:当目标列存在且该列所有行的值均为NULL时,直接执行ALTER TABLE [你的表名] DROP COLUMN [待删除列名],之后再从项目的表定义文件中移除该列。发布时预部署脚本会先完成删列操作,后续的结构比对环节不会再识别到删列变更,也就不会触发全局校验规则。 - 新增约束辅助校验后删除
先在项目的目标列定义上添加CHECK ([待删除列名] IS NULL)约束,先行发布该约束:添加约束的操作不会触发数据丢失报错,约束生效后相当于已向SQL引擎声明该列所有值均为NULL,此时再从表定义中移除该列,发布校验逻辑会识别到删列操作无数据丢失风险,不会触发报错。 - 手动修改生成的部署脚本
发布操作时选择「生成部署脚本」而非直接发布,打开生成的脚本后定位到对应删列操作前的RAISERROR校验段,删除该校验段后手动执行脚本即可。日常发布仍保留「Block on incremental deployment if data loss might occur」的勾选,不会影响其他变更的校验逻辑。
内容的提问来源于stack exchange,提问作者user736570
相关产品推荐
相关产品推荐

