我正在阅读此blog,我对所写的5篇帖子有疑问。 据我所知,您在包含所有SQL DDL语句的大基线脚本上创建。完成此操作后,您可以在单独的脚本中跟踪每个更改。
但是我不明白脚本文件的名称如何与应用程序的特定版本相关联?他说,如果用户报告3.1.5.6723中的错误,您可以将脚本重新运行到该版本。您是否会在自己的文件中跟踪对表等的更改,或者在同一个脚本文件中更改所有DLL,然后在他自己的文件中有视图等?
答案 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版开始重新创建数据库:
答案 2 :(得分:2)
您可以使用Flyway(http://flywaydb.org/)代替Liquibase,它允许您编写自己的升级/降级SQL脚本。这提供了更大的灵活性,也适用于视图和存储过程。
Liquibase要求您使用自己的基于XML的语言进行架构更改,这可能会有所限制。
答案 3 :(得分:0)
在数据库中保留版本号,并在启动时应用更新脚本是此策略的重要组成部分。
以下是启动的工作原理:
示例:
有一些警告。这合理地 ;人们声称它应该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;
}
}