【问题标题】:SQL Server : Replicate Schema changes to another databaseSQL Server:将架构更改复制到另一个数据库
【发布时间】:2018-06-08 16:10:46
【问题描述】:

我正在处理 ASP.NET Web API 中的一个需求,它需要两个相同的数据库。

我在同一台服务器上创建了两个相同的数据库。假设一个用于开发,另一个用于测试。

我想立即将所有架构(如存储过程、视图和表)更改从另一个数据库复制到另一个。

我不担心数据复制,我只需要确保两个数据库具有完全相同的架构定义。

我尝试从一个数据库生成架构并定期更新另一个数据库。但现在,我想立即将更改复制到另一个数据库。因此,当我在开发数据库中更新存储过程或视图时,同样的更改也应该立即应用于测试数据库。

我请求您告诉我这是否可能,或者是否有其他方法可以实现这一目标

【问题讨论】:

  • 您好 Sachin,您可以检查在数据库和实例对象的元数据更改上执行的 DDL 触发器。您可以创建一个通用的或多个触发器
  • 这对我来说真的感觉像是数据库源代码控制,然后使用适当的工具在每个上“部署”它。

标签: asp.net sql-server database sql-server-2012 database-replication


【解决方案1】:

我建议你使用微软的特殊解决方案。 SQL Server Data Tools for Visual Studio。这将为您的 Visual Studio 模板添加新类型的项目,并且可以免费使用(也许您甚至已经安装了它)。

这种类型的项目将包含所有数据库架构和所有过程/函数/触发器。

由于它是项目,它可以成为您解决方案的一部分,您可以将所有数据库历史更改完全存储在版本控制系统(Git、SNV、TFS 等)中。

要将更改应用到您的第二个数据库,有多种方法可以做到这一点。您可以使用.dacpac 文件的方法。或者只有 2 个发布配置文件。或者使用源比较工具。

主要思想是先在这个项目中进行更改,然后再应用到您的实际数据库中。

当然,如果您有构建服务器,则此解决方案的发布部分可以成为构建过程的一部分,您可以轻松地将更改应用到 2 个数据库。

【讨论】:

    【解决方案2】:

    对我来说,这似乎不是一个好主意。

    如果您对破坏系统的开发环境进行更改,您也会立即破坏测试环境。这会很糟糕。

    如果您在开发环境中进行代码更改,并更改数据库以支持它,如果立即复制数据库更改,您的代码和数据库将不同步,并且可能再次破坏测试环境。

    更好的方法是使用版本控制系统,将您对数据和代码的更改批量处理,然后使用手动系统或持续集成将它们一起部署到测试环境中。

    您可以使用 Visual Studio 架构比较将数据库结构更改存储为项目的一部分

    【讨论】:

      【解决方案3】:

      一种可能的(本机)解决方案是启用事务复制(仅用于 DDL 更改)

      https://docs.microsoft.com/en-us/sql/relational-databases/replication/publish/make-schema-changes-on-publication-databases

      您可以选择拥有多个数据库(订阅者)并在将来将订阅者移动到另一台服务器(如果需要)。

      其他解决方案是使用一些 3rd 方工具,例如 PS+ApexSQL Diff: https://solutioncenter.apexsql.com/how-to-automatically-keep-two-sql-server-database-schemas-in-sync/

      或 SQL 增量

      或 SQL 比较(红门)

      【讨论】:

        【解决方案4】:

        不要将一个数据库上的更改自动同步到另一个数据库,而是对您的数据库使用某种源代码控制并手动(或自动)将更改部署到两个环境。

        源头控制有各种积极的影响,无论如何都应该成为一种习惯。即使是您的数据库。

        我建议使用 Liquibase,因为它是免费的开源且非常灵活。

        【讨论】:

          【解决方案5】:

          由于我不太喜欢触发器,因为它们在我不知情的情况下进行更改,因此我建议创建一个过程来初始化每个数据库。因此,当您在架构中包含一些新代码时,请确保将其也包含在初始化过程中。 复制应始终以此过程开始。

          您是否对两个数据库上的代码进行了更改?如果你有主从关系,你只需要初始化从数据库。否则,在 master-master 的情况下,您应该保持某种版本控制。

          【讨论】:

            猜你喜欢
            • 2020-09-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-16
            • 2015-01-02
            • 2018-01-13
            • 2012-05-29
            相关资源
            最近更新 更多