数据库项目发布失败,因为部署脚本试图删除并重新创建未修改的 table
Publish of Database Project fails because deployment script attempts to drop and re-create an unmodified table
我正在使用 Visual Studio 15.8.5 和 Sql Server Data Tools 15.1。
我创建了一个 SQL 服务器数据库项目并导入了一个现有数据库的架构。我对数据库的几个表做了一些小改动,并毫无问题地将更新发布到开发数据库。
在项目中添加了几个 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
但是,Table [lut].[KAE]
没有改变。其中一个脚本正在重新定义其架构,但这应该没有什么区别,因为这是一个 'No Build' 脚本。
我在这里可能做错了什么?
编辑:
我已经按照@MadBert 的建议进行了架构比较。我最初使用我的实际数据库作为 source 和我的 sql 服务器 visual studio 项目作为 target。没有发现差异。
然后我切换了源数据库和目标数据库并再次比较。检测到以下 'difference'。
如您所见,这并不是真正的差异,它看起来像是模式比较中的 Visual Studio 错误。关于如何规避此行为的任何想法?
当 SQL Server Database project
被设置为错误的 Target platform
时出现了类似的问题。在项目属性中编辑它以匹配目标服务器。通过右键单击项目和 select Schema Compare...
再次启动架构比较。
还要检查 Ignore whitespace
是否标记在 Schema Compare Options
中。如果您仍然以某种方式存在差异,请尝试将 Notepad++
中的文本粘贴到 Show All Characters
上,看看您是否能发现差异。
如果您仍然找不到任何差异,请尝试从项目中创建一个新数据库并使用SSMS GUI
进行比较。 table 是否具有相同的锁定升级设置等?
事实证明,重构日志文件是罪魁祸首。
我试图发布到一个空数据库,正如@Ogglas 明智地建议的那样。我注意到在发布期间我收到了以下消息:
The following operation was generated from a refactoring log file
8e659d92-10bb-4ce9-xxxx-xxxxxxxxx Rename [lut].[KAE].[xxxxx] to
$$$$$$$$$ Caution: Changing any part of an object name could
break scripts and stored procedures.
然后我注意到我的 SQL 服务器数据库项目包含一个 .refactorlog 文件
似乎这个日志文件是在我更改了有问题的 table 模式之后生成的。 table 的架构后来恢复到其原始状态,但日志文件仍然存在。
我删除了这个日志文件,然后发布终于成功了!
我正在使用 Visual Studio 15.8.5 和 Sql Server Data Tools 15.1。
我创建了一个 SQL 服务器数据库项目并导入了一个现有数据库的架构。我对数据库的几个表做了一些小改动,并毫无问题地将更新发布到开发数据库。
在项目中添加了几个 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
但是,Table [lut].[KAE]
没有改变。其中一个脚本正在重新定义其架构,但这应该没有什么区别,因为这是一个 'No Build' 脚本。
我在这里可能做错了什么?
编辑:
我已经按照@MadBert 的建议进行了架构比较。我最初使用我的实际数据库作为 source 和我的 sql 服务器 visual studio 项目作为 target。没有发现差异。
然后我切换了源数据库和目标数据库并再次比较。检测到以下 'difference'。
如您所见,这并不是真正的差异,它看起来像是模式比较中的 Visual Studio 错误。关于如何规避此行为的任何想法?
当 SQL Server Database project
被设置为错误的 Target platform
时出现了类似的问题。在项目属性中编辑它以匹配目标服务器。通过右键单击项目和 select Schema Compare...
再次启动架构比较。
还要检查 Ignore whitespace
是否标记在 Schema Compare Options
中。如果您仍然以某种方式存在差异,请尝试将 Notepad++
中的文本粘贴到 Show All Characters
上,看看您是否能发现差异。
如果您仍然找不到任何差异,请尝试从项目中创建一个新数据库并使用SSMS GUI
进行比较。 table 是否具有相同的锁定升级设置等?
事实证明,重构日志文件是罪魁祸首。
我试图发布到一个空数据库,正如@Ogglas 明智地建议的那样。我注意到在发布期间我收到了以下消息:
The following operation was generated from a refactoring log file 8e659d92-10bb-4ce9-xxxx-xxxxxxxxx Rename [lut].[KAE].[xxxxx] to $$$$$$$$$ Caution: Changing any part of an object name could break scripts and stored procedures.
然后我注意到我的 SQL 服务器数据库项目包含一个 .refactorlog 文件
似乎这个日志文件是在我更改了有问题的 table 模式之后生成的。 table 的架构后来恢复到其原始状态,但日志文件仍然存在。
我删除了这个日志文件,然后发布终于成功了!