mysql - Liquibase 变更集的自动回滚

标签 mysql database maven-3 liquibase

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

这是我想评估自动回滚的变更集。现在,我试图在 外键约束 中引入一个错误,并期望 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 .

最佳答案

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

关于mysql - Liquibase 变更集的自动回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461896/

相关文章:

database - 使用 fmt.Sprintf 防止 Go 中的 sql 注入(inject)进行 native 查询

java - 设置 Maven 的问题

Maven阴影jar用作外部项目依赖项

PHP MySQL 插入数组语法

mysql - 在聚合查询中获取非聚合数据

mysql - 我需要在数据库中保存什么来记录订单历史?

android - 将 .csv 文件导入 Android 中的 Sqlite

maven - Maven 输出中 "<<<"、 ">>>"和 "---"的含义是什么?

python - 2003, "Can' t 连接到 '192.168.1.xxx' (10060) 上的 MySQL 服务器

php - 登录时不同的导航显示