我有一个简单的liquibase变更集(下面),我试图测试。
这是应用启动后运行的第二个更改日志。
我编写了一个故意错误,我尝试创建列" NEW_2"两次强制回滚变更集中的所有条目:ADD_COL_2
但是,即使生成了回滚文件,我也看到了:
INFO 4/13/16 12:17 AM:liquibase:classpath:db / changelog / db.changelog-multi-set-then-rollback.xml:classpath:db / changelog / db.changelog-multi-set- then-rollback.xml :: ADD_COL_2 :: USER1:回滚变更集:类路径:db / changelog / db.changelog-multi-set-then-rollback.xml :: ADD_COL_2 :: USER1
INFO 4/13/16 12:17 AM:liquibase:classpath:db / changelog / db.changelog-multi-set-then-rollback.xml:classpath:db / changelog / db.changelog-multi-set- then-rollback.xml :: ADD_COL_1 :: USER1:回滚变更集:类路径: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执行Native查询,我可以看到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,并在设置属性后自动执行。
答案 0 :(得分:3)
Liquibase运行任何<rollback>
部分,直到您要求它(使用liquibase命令)。它在事务中执行每个变更集,如果失败则尝试使用数据库事务引擎回滚此事务(这有一些限制,例如,如果在MySQL中添加列A并且在同一事务中无法添加列B之后,因为MySql在DDL语句之后提交,所以A不会回滚。