【问题标题】:Autorollback for Liquibase ChangesetLiquibase 变更集的自动回滚
【发布时间】:2016-05-29 11:07:57
【问题描述】:

我正在尝试 Liquibase,以尝试自动化数据库部署并围绕数据库更改获得一些结构。

这是我想要评估自动回滚的变更集。现在,我试图在foreign key constraint 中引入一个错误,并期望rollback statements 在错误之后运行,并且它也会从customer 表中删除该列。

http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">

<preConditions>
    <dbms type="mysql" />
</preConditions>

<changeSet id="002" author="Hrishi" failOnError="true" 
    runInTransaction="true">
    <preConditions onError="HALT" onFail="HALT"
        onFailMessage="The table gender doesnt exist. Precondition not met.">

            <not>
                <columnExists tableName="customer" columnName="gender_id" />
            </not>

        <and>
            <not>
                <foreignKeyConstraintExists foreignKeyName="fk_gender_customer"/>
            </not>
        </and>

    </preConditions>

    <addColumn tableName="customer" schemaName="sakila">
        <column name="gender_id" type="smallint(1)" />
    </addColumn>

    <addForeignKeyConstraint constraintName="fk_gender_customer"
        referencedTableName="gender" baseColumnNames="gender_id"
        baseTableName="customer" referencedColumnNames="invoking_an_error" />

    <rollback>
        <dropColumn tableName="customer" columnName="gender_id" />
        <dropForeignKeyConstraint baseTableName="customer"
            constraintName="fk_gender_customer" />
    </rollback>
</changeSet>

真正发生的是DATABASECHANGELOG 表中没有条目。这是我所期望的,但是customer 表中的列仍然存在。 我确实查看了关于 liquibase 文档的addColumn url 的帮助,并且支持 MySQL。

http://www.liquibase.org/documentation/changes/add_column.html

我的理解是否正确,它应该自动回滚变更集中的所有语句?

EDIT :我认为在这种特定情况下的问题是 ALTER 表是一个 DDL 语句。来自 MySQL cannot-roll-back 的文档。

【问题讨论】:

    标签: mysql database maven-3 liquibase


    【解决方案1】:

    我不确定您发出的命令,但是当发生错误时,变更集的&lt;rollback&gt; 部分中列出的更改不会自动发生。当发生错误时,liquibase 会尝试回滚数据库事务,但如果某些事情已经提交,您可能会进入不一致的状态。 &lt;rollback&gt; 标记在那里,因此您可以使用 liquibase rollback 命令手动回滚更改。

    【讨论】:

    • 我从一个 Maven 构建中执行了liquidate:update 目标。我现在明白,如果我想显式回滚变更集,则回滚语句是。​​
    • 虽然,我不明白或者可能无法理解的是,上述变更集中添加的列不应该回滚吗?或者它是被承诺的。现在,由于我提到表中没有 databasechangelog 条目。我怎么知道回滚到哪里?如果我使用 liquibase:rollback 计数为 1 它会回滚以前的变更集不是吗
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2014-04-24
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2011-03-25
    相关资源
    最近更新 更多