适当的版本控制数据库策略

时间:2012-09-30 18:25:01

标签: java mysql database version-control

我正在阅读此blog,我对所写的5篇帖子有疑问。 据我所知,您在包含所有SQL DDL语句的大基线脚本上创建。完成此操作后,您可以在单独的脚本中跟踪每个更改。

但是我不明白脚本文件的名称如何与应用程序的特定版本相关联?他说,如果用户报告3.1.5.6723中的错误,您可以将脚本重新运行到该版本。您是否会在自己的文件中跟踪对表等的更改,或者在同一个脚本文件中更改所有DLL,然后在他自己的文件中有视图等?

4 个答案:

答案 0 :(得分:4)

我个人使用liquibase。非常少数的工具。 允许非常复杂的工作流程,例如tutorial, using oracle and complicated versioning scheme

答案 1 :(得分:2)

表和视图的更改不会保留在自己的文件中。您将为每个更改创建一个新的更改脚本。因此,如果您将表'X'更改为5次,则每个更改将有5个不同的更改脚本。

如果要创建某个发行版本的架构,您将获得为该版本标记的源代码。从基线创建数据库。然后按时间顺序运行该版本代码中的更改脚本。 e.g。

db_scripts/

2012-01-01 baseline.sql:
create table book (
   book_name varchar(100),
   author_name varchar(100)
)
--- label version_1.0

2012-02-01 add_publisher.sql:
alter table book add column publisher varchar(100)
--- label version_1.1

2012-03-01 add_publish_date.sql:
alter table book add column publish_date datetime
--- label version_1.2

2012-04-01 add_rating.sql:
alter table book add column rating integer
--- label version 1.3

现在假设您要从1.2版开始重新创建数据库:

  1. 您可以将代码同步到标签version_1.2
  2. 按照baseline.sql,add_publisher.sql,add_publish_date.sql
  3. 的顺序运行脚本

答案 2 :(得分:2)

您可以使用Flyway(http://flywaydb.org/)代替Liquibase,它允许您编写自己的升级/降级SQL脚本。这提供了更大的灵活性,也适用于视图和存储过程。

Liquibase要求您使用自己的基于XML的语言进行架构更改,这可能会有所限制。

答案 3 :(得分:0)

在数据库中保留版本号,并在启动时应用更新脚本是此策略的重要组成部分。

以下是启动的工作原理:

  • 检查数据库中的DB_VERSION记录,
  • 找到更新>当前版本;也许是通过代码。
  • 运行每个适用的“更新”,脚本或程序化操作..
  • DB_VERSION会在每次更新后更新,因此可以重新运行中途的故障。

示例:

  • 当前找到DB_VERSION = 789;
  • 复杂的代码或大型长IF链,可以找到790及更新的更新。
  • 更新#790,升级客户&帐户表;
  • 更新#791,升级电子邮件表;
  • 更新#792,重组订单表;
  • 数据库版本现在= 792。

有一些警告。这合理地 ;人们声称它应该100%可靠,但事实并非如此。

脚本不完整,字段长度的变化或服务器版本的差异等问题偶尔会导致脚本/ SQL传递到某些数据库,但在其他数据库上会失败。

查找要运行的脚本,可以像使用许多IF语句的大单一方法一样简单。或者您可以通过发现或元数据加载脚本,更优雅。有时能够包含程序代码而不仅仅是SQL。

public void runDatabaseUpgrades() {
    if (version < 790) {
      // upgrade Customer and Account tbls
      version = 790;
    }
    if (version < 791) {
      // upgrade Email tbl
      version = 791;
    }
}