目前,我们使用一系列编号的脚本管理数据库(sql Server)更改。一个文件夹包含只能运行一次的脚本(表更改,数据初始化等)。另一个保存可以多次运行的所有脚本,而不用担心它们会破坏任何东西(存储过程,函数等)。
通常,当我们需要对数据库进行更改时,我们将为更改创建一个脚本,将其编号,将其粘贴到相应的文件夹中并提交。当我们推动时,我记下运行的最后一个数字,并运行所有后续的脚本。我知道有一个更好的方法来做到这一点,但是我想对你有用的方法给出你的看法。我可以使用商业解决方案,但是开源或免费的将是首选。
我的这个动机是我不想考虑什么改变,我想尽可能地减少人为错误的过程。
编辑:只是为了澄清,这是一个ASP.NET应用程序,与sql Server。我们目前使用Subversion进行版本控制。
解决方法
这里有几个人提到sql diff工具。如果您尝试取消处于未知状态的两个数据库之间的差异,那么这些可以是救生员,但是它们对管理数据库迁移的有用性非常有限,在某些情况下是不可靠的。之前我写了一个博客条目
giving a critique of this approach。
听起来像你现有的方法,数据库迁移脚本,是一个相当不错的方法。我的建议是构建一些脚本运行程序,将它们全部应用到一个空白(或引用)数据库,作为单元测试套件的一部分:那么如果有人检查一个破坏的脚本,那么它会打破构建。您需要做的另一件事是在数据库本身保留已经运行了哪些更改脚本的记录。
我建议你看看这一系列的帖子由K Scott Allen:
> Three rules for database work
> The Baseline
> Change Scripts
> Views,Stored Procedures and the Like
> Branching and Merging
(通过Jeff Atwood,Get Your Database Under Version Control)
我还推荐Scott Ambler和Pramod J Sadalage(Addison-Wesley Signature Series)这本书“重构数据库”,以更深入地处理整个数据库生命周期管理过程。