发布数据库项目失败,因为部署脚本尝试删除并重新创建未修改的表

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.__RefactorLogrefactorlog 文件的一些信息。 social.msdn.microsoft.com/Forums/en-US/… :)

以上是关于发布数据库项目失败,因为部署脚本尝试删除并重新创建未修改的表的主要内容,如果未能解决你的问题,请参考以下文章

如何部署旧版本

在重新部署 .ear 文件期间未执行 Liquibase 脚本[关闭]

从 SQL 代理运行时 SSIS 脚本任务失败

Xcode 8 App安装失败,出现未知错误

NativeScript tns 创建失败 - 在 POSTINSTALL 脚本中

构建在gitlab中自动运行