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>
与错误处理无关。
假设我们有以下变更集:
<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>
与错误处理无关。