是RedGate SQL源代码控制吗?

时间:2010-12-13 19:38:24

标签: sql-server version-control redgate

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

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

我的预订是......

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

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

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

6 个答案:

答案 0 :(得分:11)

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

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

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

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

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

当然,这是非常简化的。

专业版提供了一个同步和比较的API,因此您可以根据需要集成到您的工具链中。无需GUI。很明显,我们使用它来提供一些特殊用户沙箱的单击同步以及客户端代码。

正如雷木思所说,对于某些行动来说,它们并非万无一失。如果你要改变1.5TB桌子上的东西,我会亲切地手工编写我的脚本。另一个令人不快的是,Red gate的工具习惯于在相关视图上删除SCHEMABINDING,或者为简单的检查约束更改而放弃udf。

我还建议阅读Martin Fowler的"Evolutionary Database Design"获取一些灵感

答案 1 :(得分:8)

我也更喜欢脚本 - 易于存储在源代码控制(CVS,Git等)中,因此您可以看到更改的时间。

答案 2 :(得分:3)

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

我的方法是始终使用upgrade scripts将已部署的架构从v。N移至v。N+1。这样我知道完全如何完成升级,如果无法进行操作(需要持续2周的数据大小复制操作......)那么我知道我不能做它和我计划我的代码更改为发布v。接下来相应。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

我有一个开源(LGPL许可)工具集项目,该项目试图解决与(及更多)SQL Server(2005/2008 / Azure)bsn ModuleStore的正确数据库模式版本相关的问题。

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

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

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

根据您希望如何访问数据库,工具集提供了更多功能 - 它实现了一些ORM功能,并提供了一种非常好用且基于接口的方法来调用存储过程,包括使用本机.NET XML对XML进行透明支持类和TVP(表值参数)为IEnumerable<PocoClass>

答案 5 :(得分:0)

我们使用比较工具作为我们部署过程的一部分,以查看是否缺少需要脚本的任何内容,然后再与开发人员讨论(如果是这样的话)(通常是因为没有签入到deplyment位置的差异,因为它不应该被移动去生产)。但是我们总是从源代码控制的脚本部署。如果您依赖于SQL Compare或任何其他比较工具,您可能会发现自己正在移动那些尚未移动的东西。