14

我刚刚继承了一个 SQL Server 数据库。我需要解决的一件事是版本控制和自动化构建。

有人建议我应该认真考虑推荐RedGate SQL Compare,但我不得不承认我对此有些不安。

我的预订是...

  • 它似乎促进了 gui 工具在数据库工作中的使用?
  • 对于实时应用程序,我更喜欢使用更改脚本,这避免了在每个 scrum 周期结束时创建迁移脚本的最后一分钟恐慌,这意味着您的更新脚本可以由 CI 测试。我看不出 RedGate 工具是如何解决这个问题的。

我的直觉告诉我要坚持使用 MSBuild 文件和一堆 .SQL 文件的久经考验的方法。

我很想知道是否有人有使用此工具的经验。

4

6 回答 6

11

我们使用 Red Gate 生成用于部署的脚本并控制版本控制。

“部署”和“版本控制”是 SQL 代码的不同问题。

需要注意的重要一点:您的生产数据库是所有数据的主数据库。因此,将定期副本安排到测试服务器并将其用作基线。NUnit 每天晚上生成的带有基本数据的数据库(看到了,笑了)通常没用。如果您有十亿行并且需要针对它测试查询怎么办?

版本控制:您可以使用 Red Gate 工具生成模式作为基线,然后将其与此副本(或您的 QA 或其他)进行比较。Red Gate 工具允许与文件夹进行比较,在我们的案例中,该文件夹受 SVN 控制,并且每次发布都会更新。所以我们有每个对象的完整历史

部署:我们将我们的开发脚本(也在 SVN 中)应用于一个干净的“构建”数据库,并与另一个干净的数据库进行比较。这成为我们的部署脚本。

这当然是相当简化的。

专业版提供了一个用于同步和比较的 API,因此您可以在需要时集成到您的工具链中。不需要图形用户界面。顺便说一句,我们使用它来提供一些带有客户端代码的特殊用户沙箱的一键同步。

正如 Remus 提到的,它们对于某些操作并非万无一失。如果您要更改 1.5TB 表上的内容,我会很乐意手动编写我的脚本。另一个令人恼火的是,Red Gate 的工具习惯于将 SCHEMABINDING 放在相关视图或 udf 上,以便简单地检查约束更改。

我还推荐阅读 Martin Fowler 的“进化数据库设计”以获得一些灵感

于 2010-12-13T20:25:02.567 回答
8

我也更喜欢脚本——易于存储在源代码控制(CVS、Git 等)中,这样您就可以比较查看何时进行了更改。

于 2010-12-13T19:42:34.957 回答
3

我不相信基于差异的部署工具。这包括vsdbcmd .schema 文件,因为它们也是基于差异的。上次我尝试使用 diff 工具时,它很高兴地提供了通过复制/删除/重命名来更改 1.5 TB 表...

我的方法是始终使用将部署的架构从 v. 移动到 v.的升级脚本。这样我就可以确切地知道升级是如何完成的,如果无法进行操作(这将需要持续 2 周的数据大小复制操作......)那么我知道我做不到,我计划我的代码更改为释放 v. Next 相应地。NN+1

于 2010-12-13T20:01:57.127 回答
1

SQL Compare 可以生成一个 SQL 迁移脚本,在应用之前可以对其进行独立审查,还可以选择在工具中执行脚本。Red Gate 建议在部署到生产数据库时使用前一种方法。

对于数据库版本控制,SQL 源代码控制支持大多数源代码控制系统(例如,SVN、TFS 等,尽管 VSS 支持已被弃用)。在 v3 中,有一个链接到工作文件夹的选项,如果需要,您可以使用自己的版本控制客户端。

于 2010-12-14T19:22:28.390 回答
1

我有一个开源(在 LGPL 下获得许可)工具集项目,它试图解决与(以及更多)SQL Server(2005/2008/Azure)的正确 DB 模式版本控制相关的问题,即bsn ModuleStore

基本上,工具集的独立部分将 DB 模式的 SQL Server DB 对象编写到应用了标准格式的文件中,因此文件内容仅在对象确实发生更改时才会更改(与 VS 完成的脚本编写非常不同,它还会编写一些脚本日期等脚本,将所有对象标记为已更改,即使它们实际上是相同的)。

但是,如果您使用 .NET,工具集会超出此范围:它允许您将 SQL 脚本嵌入到库或应用程序中(作为嵌入式资源),然后让它将嵌入式脚本与数据库中的当前状态进行比较。与表无关的更改(根据Martin Fowler 的定义,那些不是“破坏性更改” )可以自动应用或根据请求应用(例如,创建和删除对象,如视图、函数、存储过程、类型、索引)和更改脚本(虽然需要手动编写)也可以应用于同一进程;还会创建新表,可选地连同它们的设置数据一起创建。更新后,将再次将数据库模式与脚本进行比较,以确保在提交更改之前成功升级数据库。

请注意,整个脚本和比较代码在没有 SMO 的情况下工作,因此在应用程序中使用 bsn ModuleStore 时不会有痛苦的 SMO 依赖。

根据您想要访问数据库的方式,该工具集提供了更多功能 - 它实现了一些 ORM 功能,并提供了一种非常好的和有用的基于接口的方法来调用存储过程,包括对带有原生 .NET XML 类的 XML 的透明支持,以及对于 TVP(表值参数)为IEnumerable<PocoClass>.

于 2011-04-05T19:40:28.733 回答
0

我们在部署过程中使用比较工具来查看是否缺少任何需要脚本的内容,如果有,请与开发人员讨论(通常这是一个未签入部署位置的差异,因为它不应该t 被转移到 prod)。但是我们总是从源代码控制中的脚本进行部署。如果您依赖 SQL 比较或任何其他比较工具,您可能会发现自己正在移动不应该移动的东西。

于 2011-10-27T20:20:27.253 回答