SSDT 架构比较始终添加对象,这些对象在解决方案中为“生成 = 无”

SSDT Schema Compare always adding objects, which are "Build = None" in Solution

提问人:Esteban P. 提问时间:10/1/2019 最后编辑:marc_sEsteban P. 更新时间:2/4/2020 访问量:972

问:

在我的Visual Studio数据库解决方案中,由于多种原因(,...导致的构建问题),我必须设置一些对象。Build action = NoneOPENQUERY

遗憾的是,架构比较不会比较这些元素。每当我进行比较“源=开发数据库”和“目标=解决方案”时,它们都会被标记为新的,模式比较将建议添加这些对象。

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

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

提前致谢

sql-server visual-studio 比较

评论

1赞 Esteban P. 10/7/2019
这是有原因的,为什么有些对象被设置为我的问题中所写的。当然,将它们设置回可以解决架构比较的问题,但会导致构建错误,我绝对想要避免Build action = NoneBuild action = compile
1赞 SebTHU 1/25/2020
好问题。我有同样的问题。由于各种原因,数据库对象通常需要从构建中排除,因为它们会导致虚假构建错误。就我而言,它是未使用的对象,它们保留在数据库中,直到下一个版本,重命名为 ZZZ,以允许快速回滚。我们真正需要的是 SchemaCompare 上的一个选项,例如“包括 BuildNone 对象”。或者一个构建选项,即“包含 SchemaCompare,但不包含构建”。数据库与其他代码项目的不同之处在于 VS 项目不 = 已部署的版本。
1赞 Gert Arnold 1/25/2020
一个最小的可重现示例将在这里有所帮助。
0赞 SebTHU 1/27/2020
@GertArnold - 用一个例子编辑了 Esteban 的问题;等待同行评审。

答:

0赞 SebTHU 2/4/2020 #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 表1 GO

这将模拟 Table1 上的有效 ALTER TABLE,但原始表将保留为重命名的已弃用对象。vwOriginalView 现在有一个无效的引用,但我们也希望保留它(暂时);它将被重命名,但这不是演示此问题的必要条件。

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

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

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