首页 文章

Liquibase部分回滚变更集

提问于
浏览
2

我有一个简单的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 回答

  • 3

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

相关问题