发布数据库项目失败,因为部署脚本尝试删除并重新创建未修改的表
Posted
技术标签:
【中文标题】发布数据库项目失败,因为部署脚本尝试删除并重新创建未修改的表【英文标题】:Publish of Database Project fails because deployment script attempts to drop and re-create an unmodified table 【发布时间】:2018-11-23 16:29:39 【问题描述】:我将 Visual Studio 15.8.5 与 Sql Server Data Tools 15.1 一起使用。
我创建了一个 SQL Server 数据库项目并导入了现有数据库的架构。我对数据库的几个表进行了一些小改动,并将更新发布到开发数据库,没有任何问题。
在项目中添加一些 SQL 脚本后,它们都带有:
Build Action = None
尽管没有对项目的任何数据库对象进行任何更改,但发布失败。
这是导致问题的自动生成的发布脚本的一部分:
/*
The table [lut].[KAE] is being dropped and re-created since all
non-computed columns within the table have been redefined.
*/
IF EXISTS (select top 1 1 from [lut].[KAE])
RAISERROR (N'Rows were detected. The schema update is terminating
because data loss might occur.', 16, 127) WITH NOWAIT
GO
不过,表 [lut].[KAE]
并未更改。其中一个脚本正在重新定义其架构,但这应该没有什么区别,因为这是一个“无构建”脚本。
我在这里可能做错了什么?
编辑:
我已经按照@MadBert 的建议进行了架构比较。我最初使用我的实际数据库作为 source 和我的 sql server visual studio 项目作为 target。未发现差异。
然后我切换源数据库和目标数据库并再次进行比较。检测到以下“差异”。
正如您所见,这并不是真正的差异,它看起来像是架构比较中的 Visual Studio 错误。关于如何规避这种行为的任何想法?
【问题讨论】:
您可以尝试在发布配置文件部署高级设置中取消选中“验证部署”并重试吗? @MadBert 我试过了,不幸的是同样的事情发生了。 我会尝试的另一件事是针对您要部署到的环境使用架构比较工具。您可能错过了一些小的变化。如果您能解决问题,请告诉我。 @MadBert 我进行了架构比较,没有差异,仍然是同样的错误。 @GiorgosBetsos 脚本是否包含表[lut].[KAE]
的实际删除?在 Visual Studio 2017 中,转到 Tools > SQL Server > New Schema Comparison...
。单击Options
并取消选中General
中的Block on possible data loss
。如果你这样做,你需要手动检查脚本,这样就不会删除你不想保存的东西。
【参考方案1】:
原来是重构日志文件是罪魁祸首。
正如@Ogglas 明智地建议的那样,我尝试发布到一个空数据库。我注意到在发布期间我收到以下消息:
以下操作是从重构日志文件生成的 8e659d92-10bb-4ce9-xxxx-xxxxxxxxx 将 [lut].[KAE].[xxxxx] 重命名为 $$$$$$$$$ 注意:更改对象名称的任何部分都可能 中断脚本和存储过程。
然后我注意到我的 SQL Server 数据库项目包含一个 .refactorlog 文件
这个日志文件似乎是在我更改了有问题的表架构后生成的。该表的架构后来恢复到其原始状态,但日志文件仍然存在。
我删除了这个日志文件,之后发布终于成功了!
【讨论】:
【参考方案2】:当SQL Server Database project
设置为错误的Target platform
时遇到类似问题。在项目属性中编辑它以匹配目标服务器。通过右键单击项目并选择Schema Compare...
再次启动模式比较。
还要检查Ignore whitespace
是否标记在Schema Compare Options
中。如果您仍然以某种方式存在差异,请尝试将文本粘贴到 Notepad++
并打开 Show All Characters
,看看您是否能发现差异。
如果您仍然找不到任何差异,请尝试从项目中创建一个新数据库并使用SSMS GUI
进行比较。该表是否具有相同的锁升级设置等?
【讨论】:
我检查了SQL Server版本,两边都是一样的。在 Schema 比较 将 Visual Studio 数据库项目 设置为 target 之后,我还进行了 Update。然后尝试再次发布。同样的错误。 @GiorgosBetsos 你能从你的项目中创建一个新的数据库来比较吗? 我就是这么做的。我注意到虽然我发布到一个空数据库,但我收到了这条消息:以下操作是从重构日志文件生成的......。然后我注意到存在一个 MyProject.refactorlog 文件(位于项目文件夹的根级别)。我删除了这个文件,瞧!发布成功!!! 棘手!很高兴一切顺利!如果其他人在此处找到此线程,这里是有关dbo.__RefactorLog
和 refactorlog
文件的一些信息。 social.msdn.microsoft.com/Forums/en-US/… :)以上是关于发布数据库项目失败,因为部署脚本尝试删除并重新创建未修改的表的主要内容,如果未能解决你的问题,请参考以下文章
在重新部署 .ear 文件期间未执行 Liquibase 脚本[关闭]