SSDT中“Drop objects not in source”设置未生效问题咨询
SSDT Schema Compare仍删除未在源中的对象(已禁用DropObjectsNotInSource)
问题详情
我使用SQL Server Data Tools(SSDT)的Schema Compare功能时,明明已经取消勾选“Drop objects not in source”选项,但执行更新操作时,SSDT仍会删除源中不存在的对象。具体情况:
- 测试覆盖了表、存储过程等对象类型
- 尝试过数据库更新项目、项目更新数据库以及跨数据库更新三种场景,问题均存在
- 查看.scmp配置文件,确认该选项的设置是正确的:
<PropertyElementName> <Name>DropObjectsNotInSource</Name> <Value>False</Value> </PropertyElementName>
使用环境:Visual Studio 2022 Enterprise 版本17.6.4
可行解决方法
- 检查单个对象的部署配置:全局设置不生效可能是因为部分对象被单独配置了删除规则。在Schema Compare的结果列表中,右键目标端的对象,打开「Properties」→「Deployment Options」,确认是否勾选了“Drop if not in source”,取消后重新生成更新脚本。
- 重建Schema Compare会话:删除现有的.scmp文件,重新创建Schema Compare会话,手动重新配置所有选项(重点确认取消“Drop objects not in source”),避免旧配置缓存导致的异常。
- 升级SSDT版本:Visual Studio 2022 17.6.x版本存在Schema Compare配置失效的已知bug,升级到17.10及以上的最新补丁版本,可修复该问题。
- 检查项目级部署设置:如果涉及SSDT项目作为源/目标,打开项目属性:
- 进入「Debug」标签,确认「Deploy Action」未设置为“Drop and Create”
- 进入「Project Settings」→「Database Settings」→「Advanced」,确认“Drop objects not in source”也设置为False(项目级配置会覆盖会话级配置)
- 手动清理更新脚本:生成更新脚本后,手动移除所有
DROP语句再执行,作为临时规避方案。
内容的提问来源于stack exchange,提问作者Shelly
相关产品推荐
相关产品推荐

