【问题标题】:Automate Visual Studio DB Schema Compare and check into GIT自动化 Visual Studio 数据库架构比较并签入 GIT
【发布时间】:2016-09-19 14:46:52
【问题描述】:

我有一个用于 SQL Server DB 的 Visual Studio 2015 DB 项目,我可以在其中进行架构比较/数据比较,并手动将项目签入 Git。我想自动化完成模式/数据比较、生成脚本并将其签入 Git 的完整过程。有可能这样做吗?如果有怎么办?

我可以做这样的事情吗? Automating Visual Studio with EnvDTE

【问题讨论】:

  • 嗯,模式比较部分有“sqlpackage”。 Red-Gate 具有 SQL 数据比较功能。但是,我不确定您为什么要将模式脚本签入 Git。签入项目并为每个版本制作快照不是很有意义吗? (我可以看到数据脚本的案例,但即便如此,这也很棘手。)
  • 是的,我想签入项目本身而不是脚本。刚刚在问题中编辑/修改。
  • 你能告诉我们更多关于当你在 git 中拥有这些数据时你打算做什么的信息吗?例如,您是否计划进行自动化部署,或者检查它是否与您的实时数据库匹配,或者收集有关您的对象如何更改的审计历史记录。
  • 我们希望将架构/数据与实时数据库相匹配,并且还需要对象的审计历史记录。长期计划是自动化数据库部署。所以简而言之,我们想做所有提到的事情。

标签: visual-studio-2015 sql-server-2012 sql-server-data-tools


【解决方案1】:

欢迎来到数据库生命周期管理 (DLM) 的世界。这是一个相当大的话题,我会尽量保持简短。

一般来说,您应该首先在源代码管理中进行更改,然后从源代码管理部署到您的生产数据库。这使您有机会在将代码部署到生产之前在开发中测试您的代码。它还确保生产数据库与您测试的版本一致。

有一系列 Microsoft、第三方和开源工具可帮助您编写数据库脚本并将其导入 Git(或任何其他源代码控制系统)。其中一些最受欢迎的是 SSDT、Redgate SQL Source Control、Redgate ReadyRoll、Flyway、DBup、Liquibase 和 DB Maestro,但还有很多其他的。

此源代码的打包和部署绝对可以自动化。对于自动化,大多数人使用自动化工具(或工具管道),如 TeamCity、TFS/VSTS、Jenkins 和/或 Octopus Deploy 来打包源代码并(可选)将其部署到数据库(或多个数据库)。这可以在每次提交或单击按钮时完成。当然,这一切的具体运作方式(以及以及如何运作)将取决于您使用的工具。

鉴于有如此多的选项,如果不知道您使用哪种数据库源代码控制工具以及用于构建/发布管理的自动化工具,或者不推荐一个,就不可能提供一个直接的分步解决方案。这里还涉及很多内容,而且远远超出单个 SO 响应中所能讨论的范围。

但是,采用数据库源代码控制和自动化发布过程非常有价值,因此我鼓励您继续前进。从您的问题中可以清楚地看出您想要改进流程。 :-)

您可能最好先查看以下内容之一(或查看我上面提到的任何其他名称):

另外,您似乎有审计问题。跟踪直接在生产中发生的更改,例如,当人们在不经过源代码控制的情况下进行热修复时。关于这个主题还有另一篇很棒的 Phil Factor 博客文章,详细介绍了 how to create your own automated process for tracking drift。但是,如果我是你,我会查看Redgate DLM Dashboard。它是第三方工具,但它是免费的,为什么要浪费时间重新发明轮子呢?

如果您想进一步支持/培训我的公司 DLM 顾问,请运行 weekly online workshops(与 Redgate 合作),您将在其中练习为 SQL Server 设置源代码控制、CI 和发布管理流程。

【讨论】:

    【解决方案2】:

    您可能需要重新考虑一下您的方法。

    一般来说,

    的工作流程

    在数据库中进行更改 -> 更新数据库项目 -> 提交更改 到源代码管理

    SSDT 不太支持;特别是关于根据数据库更改更新项目的部分。

    如果这是一个 .NET 项目,您是否会使用十六进制编辑器修补服务器上的二进制文件,然后将结果反编译为 csproj 和关联的 cs 文件以存储在源代码管理中?这听起来很荒谬,但它类似于您为数据库项目建议的工作流程。

    我相信 Redgate 工具(我不是特别熟悉)支持从已部署的数据库更新源代码控制。然而,我对上述工具足够熟悉,知道预期的用例不是

    在生产中进行更改 -> 更新源代码管理

    IMV,您可能应该分别解决“源代码控制”和“审计”问题。

    为此(使用 SSDT),您只需手动更新数据库项目一次,并将生成的文件添加到源代码管理。

    之后,您可以首先在项目中进行更改,将它们提交到源代码管理,然后然后将这些更改部署到您的数据库中。这个过程很容易自动化。

    大概它只是数据库中数据的一个子集——“静态”或“参考”数据——您需要存储在源代码管理中?最常见的方法是在数据库项目中使用部署后脚本。

    关于审计,您有几个选择。鉴于您的“故意”更改的历史将在源代码控制中,审计的主要关注点是检测生产中的不受控制的更改。这可以通过数据库触发器来完成,或者,我相信,可以通过一些商业产品(通常在幕后使用数据库触发器)来完成。在检测到此类更改时,您有几个选项 - 回滚更改、触发 DBA、更新源代码管理中的文件等。我不确定自动化这部分过程是否明智,因为您可能会想考虑为什么会发生这些变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-14
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 2020-07-21
      • 2011-03-19
      相关资源
      最近更新 更多