Liquibase:我真的需要为单行插入添加回滚部分吗?

Liquibase: Do I really need to add a rollback section for one-row insert?

假设我们有以下变更集:

   <changeSet id="add_ACME_code_to_tbl_acme" author="developer">
        <sql>
            INSERT INTO tbl_acme(identifier, description, code)
            VALUES (nextval('seq_acme'), 'acme description', 'ACME');
        </sql>
        <rollback>
            <delete tableName="tbl_acme">
                <where>code = 'ACME'</where>
            </delete>
        </rollback>
    </changeSet>

我只是想在 table.

中插入一行

在代码审查期间开始的讨论:

我们真的需要一个简单的单行插入的回滚部分吗?我们到底需要做什么? (在插入失败的情况下,尝试删除我们尝试插入但未成功插入的内容是否有意义?)以及插入究竟会出现什么问题?

不幸的是,Liquibase 回滚有点令人困惑。它们旨在回滚 已经执行的 changeSets

查看这篇关于 Rollling back changes

的文章

“Roll Back To” Modes

You can specify what changes to rollback in three ways:

Tag

Specifying a tag to rollback to will roll back all change-sets that were executed against the target database after the given tag was applied. See the command line documentation for how to tag your database.

例如iquibase:rollback -Dliquibase.rollbackTag=your-database-tag - 它会在 your-database-tag 创建后回滚所有变更集。 (您可以通过 liquibase tag 命令创建标签)。

Number of Change Sets

You can specify the number of change-sets to rollback.

例如liquibase:rollbackCountSQL 5 - 它将回滚最后 5 个执行的变更集。

Date

You can specify the date to roll back to.

例如liquibase rollbackToDate 2020-05-01T08:36:17 - 它将回滚在提供的日期之后执行的所有变更集。

顺便说一句,并不总是需要编写回滚语句。大多数时候 Liquibase 自己生成回滚语句。例如,为 <createTable tableName="new_table"> 生成的回滚语句将是:

<rollback>
    <dropTable tableName="new_table"/>
</rollback>

但如果您想覆盖它,您始终可以创建自己的 <rollback>


关于失败的变更集:

Liquibase 在事务中执行变更集。如果 changeSet 失败,则它调用的事务回滚不会进行任何更改。

<rollback> 与错误处理无关。