database - 代码控制下数据库脚本的最佳实践是什么

标签 database svn version-control

我们目前正在审查我们如何在 Subversion 中存储我们的数据库脚本(表、过程、函数、 View 、数据修复),我想知道对于什么是最好的方法是否有任何共识?

我们需要考虑的一些因素包括:

  • 我们应该 checkin “创建”脚本还是 checkin 带有“更改”脚本的增量更改
  • 我们如何跟踪给定版本的数据库状态
  • 为任何给定的发布版本从头开始构建数据库应该很容易
  • 数据库中是否应该存在一个表,列出针对它运行的脚本,或者数据库的版本等。

显然这是一个非常开放的问题,所以我很想听听人们的经验给了他们什么。

最佳答案

经过几次迭代,我们采取的做法大致是这样的:

每个表和每个存储过程一个文件。还要为其他事情分开文件,例如设置数据库用户、用他们的数据填充查找表。

表的文件以 CREATE 命令开始,随着模式的发展添加了一系列 ALTER 命令。这些命令中的每一个都包含在测试表或列是否已经存在的测试中。这意味着每个脚本都可以在最新的数据库中运行并且不会改变任何东西。这也意味着对于任何旧数据库,脚本都会将其更新为最新模式。对于空数据库,CREATE 脚本会创建表,而 ALTER 脚本将全部被跳过。

我们还有一个程序(用 Python 编写)扫描充满脚本的目录并将它们组装成一个大脚本。它解析 SQL 足以推断出表之间的依赖关系(基于外键引用)并适本地对它们进行排序。结果是一个巨大的 SQL 脚本,可以一次性使数据库符合规范。脚本组装程序还计算输入文件的 MD5 哈希值,并使用它来更新写入列表中最后一个脚本的特殊表中的版本号。

如无意外,结果是源代码的给定版本的数据库脚本创建了此代码旨在与之交互操作的模式。这也意味着有一个单一的(有点大)SQL 脚本可以提供给客户来构建新数据库或更新现有数据库。 (这在这种情况下很重要,因为会有许多数据库实例,每个客户一个。)

关于database - 代码控制下数据库脚本的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/340614/

相关文章:

mysql - 获取列名称以及第一行值?

svn - 检查当前的 SVN 存储库版本

matlab - Mac OS X 上库的回滚兼容版本

PHP错误,无法将图像插入数据库

mysql - 如何在MySQL中调试 "You have an error in your SQL syntax"?

linux - 颠覆 : unable to update the repository (RapidSVN Linux SVN GUI Tool)

version-control - 列出CVS中一年内没有编辑过的所有文件

version-control - TFS TFS 是否仍需要 .vspcc 文件?

c++ - 将 DataGridView (DataTable) 与数据库同步

svn - 我无法在 Netbeans 中指定 Subversion 存储库的位置