Liquibase变更集的自动回传

时间:2016-02-17 16:07:56

标签: mysql database maven-3 liquibase

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

这是我想要评估自动回滚的Changeset。现在,我试图在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

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

编辑:我认为此特定情况下的问题是ALTER表是DDL语句。来自MySQL cannot-roll-back的文档。

1 个答案:

答案 0 :(得分:0)

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