【问题标题】:Database Change Management using hand generated scripts [closed]使用手动生成的脚本进行数据库变更管理 [关闭]
【发布时间】:2009-11-12 16:29:36
【问题描述】:

我的需求是相当基本的,我不想重建轮子。我喜欢为我的数据库编写脚本并编写脚本将其从一个版本更新到下一个版本,即 001-create-tables.sql、002-alter-column.sql 等。

我想要的是一个简单的工具命令行或 MsBuild,它将查看数据库,查看数据库的版本(使用一些表格约定)并运行文件夹中的所有脚本,这些脚本的编号高于当前编号数据库版本。如果脚本失败/抛出错误并在该点停止,我还希望该工具回滚脚本。

这正是我想要的,但我不介意改变我的约定,尽管我确实想编写自己的 sql 脚本。我还希望该工具是免费的或开源的,因为我不需要太多。 由于我的项目是 C#,我希望该工具内置在 .Net 中

【问题讨论】:

    标签: c# .net sql-server database database-versioning


    【解决方案1】:

    你看过Open DBDiff了吗?这可能是一个不错的起点。

    如果您对开源改变主意,Red Gate's SQL Compare 是 IMO 的最佳选择。

    【讨论】:

    • SQL 比较 +1 - 希望我能负担得起。
    • Open DBDiff 看起来不错,但我已经有了我的 Diff 文件,我只需要一些东西来自动为我运行它们。
    • 尽管我很喜欢 RedGate 的工具,但我遇到了 SqlCompare 的问题 - 当您进行更改时,它往往会删除并重新创建表上的索引,并且它会重新创建 PRIMARY 上的所有索引文件组,而不是以前的位置。
    • 我使用它来比较数据库在任何更改之前和更改之后的阶段,生成的“差异” sql 脚本我通过电子邮件发送给客户以更新他们的数据库。效果很好,不适用于 sql 2000 btw。
    【解决方案2】:

    【讨论】:

    • 它是“pre-alpha”。这甚至意味着什么?
    • @Randolph:用人类的话说,它仍在顺着管子里游;-)
    • 我和一个由 8 名开发人员组成的团队已经使用它一年多了,我们已经成功地针对我们的生产和非生产环境迁移了 600 多个增量。不要让“pre-alpha”部分吓到你……它是一个学习和使用非常简单的实用程序。
    【解决方案3】:

    在 SourceForge 上有一个名为 SQLRunner 的非常有趣的项目 - 它是 C#,它是 .NET,它已经过了“pre-alpha” :-)

    我自己没有使用过,但仍然 - 看起来相当不错,恕我直言。

    马克

    【讨论】:

    • 它确实运行脚本但根本不检查版本。运行已运行的脚本会出错。
    • 除非您编写 SQL 脚本的方式是在实际运行之前测试某些内容,例如在再次创建该表之前存在该表。
    【解决方案4】:

    这是一个棘手的问题,简单明了。其他答案中提到的工具肯定会有所帮助,但您仍然需要自己做很多事情。

    实际上,我的架构中有一个表,其中存储了每个更改脚本的 ID(与我的问题/错误跟踪系统中的案例编号匹配)。在每个更改脚本的末尾,我将 ID 插入到该表中。我有一个单独的脚本,用于检查在数据库的任何特定实例上做了什么。自动运行每个尚未运行的脚本是可行的,但我喜欢手动运行更改脚本以防出现任何问题。

    回滚几乎是不可能的,尤其是因为许多架构更改需要某种数据迁移。我发现对模式进行任何更改的最佳实践是使它们向后兼容。永远不要重命名列或表(至少一开始是这样)。只添加东西,并使所有新添加都可以为空。如果您意识到某些事情不太正确,回滚脚本只会删除新内容。当然,您最终会得到旧的、未使用的列和表,因此您编写了第二个脚本,该脚本在当前版本被认为稳定后运行,从而摆脱了旧的东西。

    【讨论】:

    • Eric,您的目标是什么 DBMS?我了解到,每当您进行架构更改时,Oracle 都会执行隐式提交,但另一方面,SQL Server 可以回滚架构以及数据更改。唯一看起来可以工作的工具是 dbdeploy.net,但它是我见过的最大的过度杀伤力,并且会创造比它节省的更多的工作。我可能会自己动手
    • 好吧,我的迁移脚本往往涉及数百万条记录,因此事务已失效——这会使数据库锁定太久。我正在使用 Sql Server。
    【解决方案5】:

    如果您想自己编写所有脚本,您可以利用SQL Server 2005 TableDiff Utility,这将为您提供很大的灵活性。一些使用示例可以找到here

    【讨论】:

      【解决方案6】:

      如果您将给定版本的所有脚本都放在一个文件夹中,则可以将其作为批处理文件运行(如果您将其放在该文件夹中):

      for %%X in (*.SQL) do SQLCMD -S <SERVER_NAME> -d <DATABASE_NAME> -E -I -i "%%X"  >> ResultBatch.txt
      

      对不起,我不记得我是从哪里得到这个的,否则我会给予信任。

      【讨论】:

      • 我可能会看这样的东西。我确实需要它在运行脚本之前以某种方式检查数据库版本,但是它不会每次都重复脚本。
      【解决方案7】:

      好的,所以我不喜欢在那里找到的任何选项。我找到了一些创建脚本的好工具,但没有任何工具可以跟踪数据库中的版本并运行新脚本。无论如何,我继续使用自己的开源工具来完成工作。如果你想使用它,你可以从 CodePlex 下载它的名称为KissDB。我还在我的博客blog.RunXc

      上发表了一篇关于它的博文

      【讨论】:

        【解决方案8】:

        我们让我们的开发人员将数据库更改脚本检查到 Subversion 中。所有脚本都是可重复的,因此您可以多次运行它们而不会出错。我们还将更改脚本链接到问题项或错误 ID,以便我们可以在需要时保留更改集。然后,我们有一个自动构建过程,它会踢出一个 SQL 脚本文件,其中所有更改都已适当排序。然后使用这个单一文件来促进对测试、QA 和生产环境的更改。我们认为这是企业开发人员的最佳方法。有关我们如何做到这一点的更多详细信息HERE我们将不胜感激。

        【讨论】:

          【解决方案9】:

          使用 liquibase。虽然是 Java。

          是的,您可以使用您选择的 SQL 变体编写迁移脚本。

          它经过了很好的测试并被很多人使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-25
            • 1970-01-01
            • 2016-08-12
            • 1970-01-01
            • 1970-01-01
            • 2014-01-11
            • 2011-11-07
            • 2010-09-05
            相关资源
            最近更新 更多