你的团队如何分享SQL更改?

7

每当您进行数据库更改时,您如何将这些更改应用于团队中的其他数据库(以及您的服务器)?

目前,我们正在使用一个名为changes.sql的文件,其中我们将所有更改分开并用ISO日期注释分隔。

是否有更好的方法?

5个回答

2
我们采用了您提供的方法的扩展版本。
我们为每个发行版准备了一个数据库升级文件夹,其中包含所有发布版中的脚本。该文件夹中有一个索引文件,其中包含指向应该运行的所有脚本的伪链接。
每晚都会运行一个Cruise Control任务,以恢复当前生产数据库的副本,然后运行当前版本的升级脚本(通过执行在索引文件中定义的脚本)。还有一个CI任务,每当有人将任何内容检入到当前版本的升级文件夹中时就会运行。
很明显,这些脚本需要能够重新运行,例如,在删除或创建某些内容之前,它们应该检查其是否存在。

那么,如果更改文件包含INSERT INTO,您是否首先检查其存在?SELECT ... WHERE?如果没有标识符可以进行检查,该怎么办? - Tower
我猜这取决于你要插入什么,以及插入两次的后果是什么。它会因为唯一索引约束而失败,还是会被插入,如果是这样,那么会创建不良数据吗?我们想确保一致性,所以我们的插入通常会被IF [NOT] EXISTS (SELECT 1 FROM x WHERE ...)包装。有时WHERE子句将包含一些字段进行匹配 - 如果您要插入某些内容,则应该知道它们是什么,并且大多数实体都将具有某种自然键。 - Winston Smith

1

看一下http://dbmaintain.org/overview.html - 这是一个相当强大的工具,用于管理数据库更新。它基本上通过按正确顺序执行多个SQL脚本来工作。它会记住已经执行过哪些脚本。如果已执行的脚本被更改,它会报告错误(在生产模式下)或清除数据库并重新执行所有脚本(在测试模式下)。这里还有一个很好的教程。

编辑:您还可以将SQL脚本分组(例如按发布版本)。这里的重要优点是您可以为单元测试、测试环境、持续集成、近实时和生产环境使用相同的测试。


0
在我目前的工作中没有,但是在过去,我曾经在Visual Studio 2010中使用数据库项目,然后将其发布到SVN。我们有一个SOP而不是软件自动化来推动从开发到QA、staging和production的变更。
我所在的团队很小——五名开发人员共同负责DB设计和.NET开发。

0
你还应该考虑在数据库上使用版本控制。一个例子是Liquibase。通过使用版本控制,您可以对表结构的所有更改进行注释,因此您不需要一个changes.sql文件。

0

我们使用迁移工具(migratordotnet - 还有其他替代品)来编写执行数据库命令的 C# 类。每次程序或集成测试调用时,迁移都在本地运行,并在每次部署时在服务器上运行。迁移框架会自动跟踪已应用的迁移。当然,这些迁移是版本控制存储库的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接