【发布时间】:2016-04-12 22:48:25
【问题描述】:
我正在尝试测试一个简单的 liquibase 变更集(如下)。
这是应用启动后运行的第二个变更日志。
我编写了一个故意的错误,我尝试创建列“NEW_2”两次以强制回滚变更集中的所有条目:ADD_COL_2
但是,即使生成了回滚文件并且我看到了:
INFO 16 年 4 月 13 日上午 12:17:liquibase:类路径:db/changelog/db.changelog-multi-set-then-rollback.xml:类路径:db/changelog/db.changelog-multi-set- then-rollback.xml::ADD_COL_2::USER1: 回滚变更集:classpath:db/changelog/db.changelog-multi-set-then-rollback.xml::ADD_COL_2::USER1
INFO 16 年 4 月 13 日上午 12:17:liquibase:类路径:db/changelog/db.changelog-multi-set-then-rollback.xml:类路径:db/changelog/db.changelog-multi-set- then-rollback.xml::ADD_COL_1::USER1: 回滚变更集:classpath:db/changelog/db.changelog-multi-set-then-rollback.xml::ADD_COL_1::USER1
在日志中,只有 NEW_4 和 NEW_5 列创建被回滚。
ADD_COL_2 更改日志未出现在 DATABASECHANGELOG 中。
ADD_COL_1 更改日志确实出现在 DATABASECHANGELOG 中。
为了测试回滚是否有效,我对 TABLE_1 执行本机查询,我可以看到 NEW_1,2 的值。我只希望看到 NEW_1,因为 NEW_2 是失败变更集的一部分?
如果我还查询 INFORMATION_SCHEMA.TABLES,我会看到 NEW_1 和 NEW_2。
我尝试了无回滚标签、每个语句的显式回滚标签、组标签的组合,但都无济于事。 我试图将标签移动到它自己的变更集。
对我来说似乎正在发生的事情是直到失败的命令的所有更改都没有回滚。
我需要手动调用一些东西吗?我是否需要手动执行回滚文件,我是否误解了 liquibase 的工作原理,它在失败时不是自动的???
我真的在我的智慧尽头,我(认为)我已经运行了所有可能的组合..我希望我在做一些愚蠢的事情!
非常感谢任何帮助!
我正在使用 Spring 版本 4.1.7、Liquibase 3.4.2 并在 Junit 中运行测试。
变更集:问题 ADD_COL_2 未完全回滚,NEW_2 列仍保留在 TABLE_1 中
<changeSet id="ADD_COL_1" author="USER1" failOnError="true">
<comment>Add column NEW_1 to TABLE_1</comment>
<tagDatabase tag="ADD_COL_1"/>
<addColumn tableName="TABLE_1">
<column name="NEW_1" type="varchar(10)" value="NEW_1"/>
</addColumn>
</changeSet>
<changeSet id="ADD_COL_2" author="USER1" failOnError="true">
<tagDatabase tag="ADD_COL_2"/>
<comment>Add column NEW_2 to TABLE_1</comment>
<addColumn tableName="TABLE_1">
<column name="NEW_2" type="varchar(10)" value="NEW_2"/>
</addColumn>
<comment>Add column NEW_3 to TABLE_1</comment>
<addColumn tableName="TABLE_1">
<column name="NEW_2" type="varchar(10)" value="NEW_3"/>
</addColumn>
<comment>Add column NEW_4 to TABLE_1</comment>
<addColumn tableName="TABLE_1">
<column name="NEW_4" type="varchar(10)"/>
</addColumn>
<comment>Add column NEW_5 to TABLE_1</comment>
<addColumn tableName="TABLE_1">
<column name="NEW_5" type="varchar(10)"/>
</addColumn>
<rollback>
<dropColumn tableName="TABLE_1" columnName="NEW_2"/>
<dropColumn tableName="TABLE_1" columnName="NEW_3"/>
<dropColumn tableName="TABLE_1" columnName="NEW_4"/>
<dropColumn tableName="TABLE_1" columnName="NEW_5"/>
</rollback>
</changeSet>
**************** 附加信息 ****************
更新在我的应用程序内部运行,不运行外部 liquibase 命令。
我的服务扩展了 SpringLiquibase 并在设置属性后自动执行。
【问题讨论】:
标签: liquibase rollback changeset