如果标记应用于runOnChange变更集,则回滚到标记不起作用

时间:2017-10-18 17:16:18

标签: liquibase

我已经能够使用模式更改进行回滚标记,但是当我混合使用存储过程时,我遇到了一个无效的方案。
我正在对Oracle数据库使用SQL更改日志。这是场景:

发布1.0.0
我有一个脚本r-1.0.0.sql包含创建一个表,以及一个脚本proc.sql创建一个存储过程。 proc变更集标记为runOnChange = true 我对这些更改感到满意,并使用标签1.0.0标记数据库 最后,DATABASECHANGELOG表显示:
1 - r-1.0.0.sql-EXECUTED
2 - proc.sql-EXECUTED-(tag)1.0.0

发布2.0.0
我有一个重命名列的脚本r-2.0.0,我还使用新的列名更新了proc.sql。运行之后,DATABASECHANGELOG是:
1 - r-1.0.0.sql-EXECUTED
4 - proc.sql-RERAN-(tag)1.0.0
3 - r-2.0.0.sql-EXECUTED

您注意到重新运行的proc脚本有一个新编号,但它仍保留1.0.0标记

如果现在我想回滚到标记1.0.0,则rollback命令不执行任何操作,因为标记1.0.0对应于日志中的最新更改。

这似乎是设计上的。是否有不同的方式来组织我的更改以使其工作?

1 个答案:

答案 0 :(得分:0)

我找到了一个基于我上面链接的文章的解决方案。由于我的环境中的限制,我没有一种简单的方法来传递Java环境变量。我最终安装了一个自定义批处理文件(我将其命名为Liquibase-sp.bat),其中包含以下内容:

@echo off

IF NOT DEFINED JAVA_OPTS set JAVA_OPTS=
set JAVA_OPTS=-Dliquibase.databaseChangeLogTableName=STOREDPROCCHANGELOG %JAVA_OPTS%

liquibase %*

它在Liquibase批处理文件使用的变量中设置参数,然后调用批处理文件传递整个命令行。
在部署期间,我通过调用" liquibase"来应用模式更改,然后通过调用" liquibase-sp"来应用存储过程更改。架构更改将记录在默认的DATABASECHANGELOG表中,而proc更改将记录在单独的STOREDPROCCHANGELOG表中。所有标记都是在调用" liquibase"所以它使用默认表,只有架构更改被标记为版本。

回滚在我提到的场景中有效。

如果我的版本2.0.0没有任何更改,我希望看到一个额外的问题。当我使用2.0.0标记数据库时,最后一个变更集上的标记从1.0.0修改为2.0.0。这意味着标记1.0.0的任何回滚都将失败。我并不担心,这方面有程序性的解决方法。