SSDT Schema Compare 总是添加对象,在解决方案中是“Build = None”

Posted

技术标签:

【中文标题】SSDT Schema Compare 总是添加对象,在解决方案中是“Build = None”【英文标题】:SSDT Schema Compare always adding objects, which are "Build = None" in Solution 【发布时间】:2020-01-30 10:28:28 【问题描述】:

在我的 Visual Studio 数据库解决方案中,我有一些对象,我不得不设置 Build action = None,原因有几个(OPENQUERY 引起的构建问题,...)。

不幸的是,Schema Compare 不比较这些元素。每当我比较“源 = 开发数据库”和“目标 = 解决方案”时,它们都会被标记为新的,并且架构比较会建议 添加这些对象。

如果我添加这些对象,更新将识别它们已经在解决方案中,并将添加具有新名称 [objectname]+_1Build action = Build 的元素,这将当然会在下一次构建期间引起问题。

有人知道是否有解决此问题的简单方法吗?除了使用Pre-buildPost-Build 命令行,在构建之前禁用对象并在再次构建之后启用它们。

提前致谢

【问题讨论】:

有一个原因,为什么某些对象被设置为Build action = None,正如我在我的问题中所写的那样。当然,将它们设置回Build action = compile 可以解决模式比较的问题,但会导致构建错误,我绝对想避免这种情况 很好的问题。我也有同样的问题。 DB 对象通常需要从构建中排除,因为它们会由于各种原因导致虚假的构建错误。在我的情况下,它是未使用的对象,它们保留在数据库中直到下一个版本,重命名为 ZZZ,以允许快速回滚。我们真正需要的是 SchemaCompare 上的一个选项,例如“包含 BuildNone 对象”。或者是“包含用于 SchemaCompare,但不用于构建”的构建选项。 DB 与其他代码项目的不同之处在于 VS 项目不 = 已部署的版本。 minimal reproducible example 在这里会有所帮助。 @GertArnold - 用一个例子编辑了 Esteban 的问题;等待同行评审。 【参考方案1】:

评论中要求的最小可重复示例:

SebTHU:添加最小可重现示例。

创建一个新的空沙盒数据库。 在数据库中,运行这个脚本:

CREATE TABLE Table1(PersonID INT NOT NULL,FullNam nvarchar(255) NOT NULL) GO CREATE TABLE Table1_New (PersonID INT NOT NULL,FullName nvarchar(255) NOT NULL) GO CREATE VIEW vwOriginalView AS SELECT PersonID,FullNam FROM Table1 GO EXEC sp_rename 'Table1','ZZZTable1','OBJECT' GO EXEC sp_rename 'Table1_New','Table1','OBJECT' GO CREATE VIEW vwNewView AS SELECT PersonID,FullName FROM Table1 GO

这在 Table1 上模拟了一个有效的 ALTER TABLE,但原始表被保留为重命名的弃用对象。 vwOriginalView 现在有一个无效的引用,但我们也想保留它(暂时);它会被重命名,但这不是证明这个问题所必需的。

在 VS 中,创建一个新的数据库项目。 针对沙盒数据库运行架构比较。按更新将 4 个对象的脚本添加到项目中。保持比较窗口打开。 现在存在构建错误(vwOriginalView 对 Fullnam 列的引用无效)。要忽略此对象,请将其 BuildAction 设置为 None。错误消失。 再次按比较窗口上的比较。 vwOriginalView 现在在数据库中显示为“新”对象,以添加到项目中。 这就是问题。很高兴提醒您,如果项目中确实存在,则对象的 BuildAction 设置为 None。但是对于许多 (20-30) 此类对象,SchemaCompare 变得令人困惑。

我需要的是一种比较方法,可以将“BuildAction=None”对象视为项目中的现有对象——理想情况下可作为一个选项进行切换,这样如果需要,这些对象可以在比较中清晰可见;或一种使弃用对象(特别是我选择的对象)不会导致构建错误的方法 - “BuildAction=None”的替代方法。

我在 VS 中尝试过 SQL 错误抑制,但一方面它不起作用,另一方面在全局范围内抑制此类错误是个坏主意。

【讨论】:

以上是关于SSDT Schema Compare 总是添加对象,在解决方案中是“Build = None”的主要内容,如果未能解决你的问题,请参考以下文章

在 SSDT Schema 比较中,我如何忽略“Schema”类型的对象的差异

SSDT 数据库项目中对系统数据库的引用变得重复

如何通过 Visual Studio Schema Compare 不断显示差异?

VS 2010 Schema Compare中的对象名称中可以忽略模式吗?

Schema Compare and Update 注释掉未使用的代码

bcrypt.compare() 在验证密码时总是返回 false