我们目前正在审查如何在subversion中存储我们的数据库脚本(表,过程,函数,视图,数据修复),我想知道对于什么是最佳方法是否有任何共识?
我们需要考虑的一些因素包括:
我们应该使用'Alter'脚本签入'Create'脚本或签入增量更改
我们如何跟踪给定版本的数据库状态
对于任何给定的发行版本,从头开始构建数据库应该很容易
数据库中是否存在一个表,列出了针对它运行的脚本,或者数据库的版本等.
显然这是一个非常开放的问题,所以我很想知道人们的经历教给他们什么.
经过几次迭代后,我们采用的方法大致如下:
每个表和每个存储过程一个文件.还可以为其他内容分隔文件,例如设置数据库用户,使用其数据填充查找表.
表的文件以CREATE命令开始,并随着模式的发展添加一系列ALTER命令.在测试表或列是否已存在时,这些命令中的每一个都被括起来.这意味着每个脚本都可以在最新的数据库中运行,并且不会更改任何内容.它还意味着对于任何旧数据库,脚本都会将其更新为最新的模式.对于空数据库,CREATE脚本会创建表,并且会跳过ALTER脚本.
我们还有一个程序(用Python编写),它扫描完整的脚本目录并将它们组装成一个大脚本.它解析SQL就足以推断表之间的依赖关系(基于外键引用)并对它们进行适当的排序.结果是一个怪物SQL脚本,一次性使数据库达到规范.脚本组装程序还计算输入文件的MD5哈希值,并使用它来更新写入列表中最后一个脚本中的特殊表的版本号.
除非发生意外,否则结果是源代码的给定版本的数据库脚本会创建此代码旨在与之互操作的架构.它还意味着有一个(有点大)的SQL脚本可以让客户构建新数据库或更新现有数据库.(在这种情况下,这很重要,因为数据库会有很多实例,每个客户都有一个实例.)