当前位置: 首页 > 知识库问答 >
问题:

Liquibase部分回滚变更集

徐高懿
2023-03-14

我有一个简单的liquibase变更集(下面),我正在尝试测试它。

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

我故意编写了一个错误代码,其中我尝试创建列“new_2”两次,以强制回滚变更集中的所有条目:ADD_COL_2

然而,即使生成了回滚文件,并且我看到:

信息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:回滚changeset:classpath:db/changelog/db.changelog-multi-set-then-rollback.xml::add_col_2::user1:回滚changeset:classpath:db/changelog/db.changelog-multi-set-then-rollback.xml::add_col_2::user1

信息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:回滚changeset:classpath:db/changelog/db.changelog-multi-set-then-rollback.xml::add_col_1::user1:回滚changeset:classpath:db/changelog/db.changelog-multi-set-then-rollback.xml::add_col_1::user1

在日志中,仅回滚NEW_4&NEW_5列create。

ADD_COL_2更改日志不出现在DatabaseChangelog中。

ADD_COL_1 changelog在databasechangelog中执行apppear。

我真的在这里一筹莫展,我想我已经跑了所有可能的组合…我希望我在做傻事!

任何帮助都是无限感激的!!

我正在使用Spring版本4.1.7、LiquiBase3.4.2并在JUnit中运行测试。

    <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>

共有1个答案

吕寒
2023-03-14

Liquibase不会运行任何 部分,直到您要求它运行(使用Liquibase命令)。它执行事务中的每个变更集,如果失败,它会尝试使用数据库事务引擎回滚这个事务(这有一些限制,例如,如果在MySQL中添加列a,而在它失败后在同一事务中添加列B,则不会回滚a,因为MySQL确实在DDL语句之后提交)。

 类似资料:
  • 我的问题是liquibase没有回滚我的一些变更集,这些变更集是在我试图回滚的变更集上设置标签后执行的。 例如,我创建了两个按正常方式执行的变更集(A和B)。然后,我创建了另一个变更集,它将变更集B的标记设置为Release1。并且这个变更集也按预期工作。但是,我随后执行另外5个变更集,所有变更集都使用回滚命令。而且这些也执行得很好。 现在,这个回滚不应该回滚在执行release1标记之后执行的任

  • 这方面有什么最佳做法吗?我们不能在LiquiBase中手动设置事务吗?

  • 我使用LiquiBase3.4.1和MySQL56并通过spring boot运行Liquibase。 我有一个变更集,其中包括向现有表中添加一列。新的具有属性,并带有一个简单的select。 当我在该选择中出错时,变更集失败,迁移在该变更集停止。然而,新列被提交到数据库,但没有正确的值,而且,最糟糕的是,这个变更集没有标记为run!下一次运行迁移时,Liquibase再次尝试执行变更集,但失败了

  • case-0-3.sql: 我在进行任何更改之前标记数据库: 之后,我在每个文件应用后应用文件和标记数据库: 求求你,救命。可能有人在sql或其他格式中使用回滚操作?哪里错了?我做错了什么?它是工作液基功能吗?

  • 我正在处理一个分支,例如需要删除表X中的一列,我添加了一个更改,它对该特定分支有好处,然后我切换到另一个分支,该分支仍然需要该列,并且该更改需要回滚。db在不同的分支之间有很多变化,比如这样的变化。 我为每个分支添加一个新的changelog xml,并将其包含在主changelog xml中。显然,当我切换到另一个分支时,前一个分支的changlog xml不再在工作区中,并且liquibase