6

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

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

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

4

9 回答 9

6

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

如果您改变了对开源的想法,Red Gate 的 SQL 比较是 IMO 的出路。

于 2009-11-12T16:34:06.787 回答
2

尝试 dbdeploy.NET

http://sourceforge.net/projects/dbdeploy-net/

于 2009-11-12T16:33:26.290 回答
1

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

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

马克

于 2009-11-12T16:43:36.690 回答
1

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

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

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

于 2009-11-13T11:26:28.987 回答
0

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

于 2009-11-12T16:56:07.803 回答
0

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

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

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

于 2009-11-12T16:59:04.947 回答
0

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

于 2009-11-19T15:29:06.340 回答
0

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

于 2010-09-16T00:59:39.420 回答
0

使用 liquibase。虽然是 Java。

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

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

于 2013-12-23T21:36:37.583 回答