Liquibase部分回滚变更集

时间:2016-04-12 22:48:25

标签: liquibase rollback changeset

我有一个简单的liquibase变更集(下面),我试图测试。

这是应用启动后运行的第二个更改日志。

我编写了一个故意错误,我尝试创建列" NEW_2"两次强制回滚变更集中的所有条目:ADD_COL_2

但是,即使生成了回滚文件,我也看到了:

INFO 4/13/16 12:17 AM:liquibase:classpath:db / changelog / db.changelog-multi-set-then-rollback.xml:classpath:db / changelog / db.changelog-multi-set- then-rollback.xml :: ADD_COL_2 :: USER1:回滚变更集:类路径:db / changelog / db.changelog-multi-set-then-rollback.xml :: ADD_COL_2 :: USER1

INFO 4/13/16 12:17 AM:liquibase:classpath:db / changelog / db.changelog-multi-set-then-rollback.xml:classpath:db / changelog / db.changelog-multi-set- then-rollback.xml :: ADD_COL_1 :: USER1:回滚变更集:类路径:db / changelog / db.changelog-multi-set-then-rollback.xml :: ADD_COL_1 :: USER1

在日志中,只有NEW_4& NEW_5列创建将回滚。

ADD_COL_2更改日志未显示在DATABASECHANGELOG中。

ADD_COL_1更改日志在DATABASECHANGELOG中适用。

为了测试回滚是否有效,我对TABLE_1执行Native查询,我可以看到NEW_1,2的值..我只希望看到NEW_1,因为NEW_2是失败的变更集的一部分?

如果我还查询INFORMATION_SCHEMA.TABLES,我会看到NEW_1和NEW_2。

我尝试过没有回滚标记,每个语句的显式回滚标记,组标记的组合,但都无济于事。 我试图将标签移动到自己的变更集。

对我而言,似乎正在发生的事情是,所有对失败命令的更改都不会回滚。

我需要手动拨打电话吗?我是否需要手动执行回滚文件,我是否误解了liquibase的工作方式,并且在失败时不会自动执行???

我真的在我的智慧结束,我(我想)我可能会对所有可能的组合运行。我希望我做一些愚蠢的事情!

任何帮助都是无法估量的!!

我正在使用Spring版本4.1.7,Liquibase 3.4.2并在Junit中运行测试。

更改集:问题ADD_COL_2未完全回滚,NEW_2列仍保留在TABLE_1中

    <changeSet id="ADD_COL_1" author="USER1" failOnError="true">
    <comment>Add column NEW_1 to TABLE_1</comment>
    <tagDatabase tag="ADD_COL_1"/>
    <addColumn tableName="TABLE_1">
        <column name="NEW_1" type="varchar(10)" value="NEW_1"/>
    </addColumn>
</changeSet>

<changeSet id="ADD_COL_2" author="USER1" failOnError="true">
    <tagDatabase tag="ADD_COL_2"/>
    <comment>Add column NEW_2 to TABLE_1</comment>
    <addColumn tableName="TABLE_1">
        <column name="NEW_2" type="varchar(10)" value="NEW_2"/>
    </addColumn>

    <comment>Add column NEW_3 to TABLE_1</comment>
    <addColumn tableName="TABLE_1">
        <column name="NEW_2" type="varchar(10)" value="NEW_3"/>
    </addColumn>

    <comment>Add column NEW_4 to TABLE_1</comment>
    <addColumn tableName="TABLE_1">
        <column name="NEW_4" type="varchar(10)"/>
    </addColumn>

    <comment>Add column NEW_5 to TABLE_1</comment>
    <addColumn tableName="TABLE_1">
        <column name="NEW_5" type="varchar(10)"/>
    </addColumn>

    <rollback>
        <dropColumn tableName="TABLE_1" columnName="NEW_2"/>
        <dropColumn tableName="TABLE_1" columnName="NEW_3"/>
        <dropColumn tableName="TABLE_1" columnName="NEW_4"/>
        <dropColumn tableName="TABLE_1" columnName="NEW_5"/>
    </rollback>
</changeSet>

****************附加信息****************

更新在我的应用程序内部运行,不运行外部liquibase命令。

我的服务扩展了SpringLiquibase,并在设置属性后自动执行。

1 个答案:

答案 0 :(得分:3)

Liquibase运行任何<rollback>部分,直到您要求它(使用liquibase命令)。它在事务中执行每个变更集,如果失败则尝试使用数据库事务引擎回滚此事务(这有一些限制,例如,如果在MySQL中添加列A并且在同一事务中无法添加列B之后,因为MySql在DDL语句之后提交,所以A不会回滚。