使用手动生成的脚本进行数据库更改

时间:2009-11-12 16:29:37

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

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

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

这就是我想要的但我不介意改变我的约定,虽然我想写自己的sql脚本。我也希望该工具是免费的或开源的,因为我不需要太多。 由于我的项目是C#,我更喜欢在.Net中构建工具

8 个答案:

答案 0 :(得分:6)

你看过Open DBDiff了吗?这可能是一个好的开始。

如果你改变主意关于开源,Red Gate's SQL Compare是进入IMO的方式。

答案 1 :(得分:2)

答案 2 :(得分:1)

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

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

马克

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

我想自己编写所有脚本,你可以利用SQL Server 2005 TableDiff Utility来提供很大的灵活性。一些用法示例可以找到here

答案 5 :(得分:0)

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

上发布了一篇关于它的博客文章

答案 6 :(得分:0)

我们让开发人员检查数据库更改脚本到Subversion。所有脚本都是可重复的,因此您可以多次运行它们而不会出错。我们还将更改脚本链接到问题项或错误ID,以便我们可以根据需要阻止更改集。然后,我们有一个自动构建过程,可以启动单个SQL脚本文件,并对所有更改进行适当排序。然后,此单个文件用于促进对测试,QA和生产环境的更改。我们认为这是企业开发人员的最佳方法。关于我们如何做的更多细节HERE我们将非常感谢您的反馈。

答案 7 :(得分:0)

使用liquibase。它虽然是Java。

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

经过充分测试并被很多人使用。