是否可以利用 SQL Server 数据库项目来管理一组具有各种架构差异的数据库?

Posted

技术标签:

【中文标题】是否可以利用 SQL Server 数据库项目来管理一组具有各种架构差异的数据库?【英文标题】:Is it possible to leverage a SQL Server database project to manage a set of databases which have various schema differences? 【发布时间】:2021-01-28 19:53:02 【问题描述】:

我有一个部署到 10 个数据库的架构。尽管每个数据库都有一些架构自定义 - 某些表中的附加列、附加/更改的过程等。最终结果是 75% 的架构是共享的,但另外 25% 是每个数据库唯一的。

我知道我可以简单地创建 10 个不同的 SQL Server 数据库项目并分别管理它们。不过,我怀疑对于这种常见的用例,有一种更好的方法可以减少重复。

Visual Studio 的 SQL Server 数据库项目是否主要支持这种设计的集中管理?我正在寻找可以在一个位置而不是多个位置更改共享代码的东西。

如果是这样,我将如何配置?

这个问题听起来可能与Is it possible to use MS VS Database Project as a complete solution for database versioning? 的第一句话有些相似,但这个问题最终很笼统。我特别希望在大多数共享模式的问题上归零。

【问题讨论】:

我把我的差异放在不同的架构中,然后使用数据库项目来同步dbo @DaleK,这将是一个整洁的解决方案,不幸的是,这不是绿地,这不是我的选择。 【参考方案1】:

这在理论上是可能的。它对您的情况有多好还有待观察。数据库项目可以引用解决方案中的其他项目。下面是我作为测试所做的快速设置。

添加数据库引用时,您需要选择“相同数据库”选项,如下所示:

通过此设置,您的数据库之间确实相同的任何内容都将进入引用的数据库项目(在我的示例中为 CascadeSchema)。任何不同的东西都需要进入各个数据库项目。您将从下级数据库项目(在我的示例中为 DBOne、DBTwo)进行部署。

这不能很好地处理的一件事是,如果同一个表在从属数据库之间具有不同的结构。您提到了具有不同列的同一张表。在这种情况下,该表需要存在于从属数据库项目中,可能大部分 create table DDL 都重复了。技术债务(即技术债务)与金融债务一样,是有成本的,您必须在某个地方支付。

可能有不同的架构是故意的,或者它可能是累积发生的。在后一种情况下,当您合并/协调跨数据库的对象差异时,您可以将该对象移动到通用模式数据库项目中。即使差异是有意的,您现在至少可以在数据库之间进行差异以量化/限定这些差异。

【讨论】:

经过一段时间的测试后,我得出的结论是,对于这个用例来说,这不是一个好的解决方案。在进行比较或部署时,引用另一个数据库项目不会将 CascadeSchema 合并到 DBOne 中,因此很遗憾,无法使用此设置。 有趣。我仍然有我的测试解决方案并尝试了您的用例。我在所有级别都进行了更改(特定于示例,我在 CascadeSchema 中的表中添加了一个新列,并更改了 DBOne 和 DBTwo 中的过程)。架构比较错误地将表标识为需要删除。但是,如果我去做 Publish 一切都按预期发生。我会再调查一些。 想通了。在模式比较选项中,有一个“包含复合对象”选项。在我的安装中,它默认为关闭。当我将其设置为打开并重新比较时,它正确地拾取了新列(而不是想要删除表)。

以上是关于是否可以利用 SQL Server 数据库项目来管理一组具有各种架构差异的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server创建存储过程——动态SQL

SQL Server创建存储过程——动态SQL

SQL Server创建存储过程——动态SQL

是否可以在 SQL Server 2014 中为 .NET 框架程序集创建非对称密钥?

是否可以使用 SQL Server 使用相同的数据透视列进行多个数据透视

是否可以让 SQL Server 将排序规则转换为 UTF-8 / UTF-16