Liquibase回滚并不是智能的,无法确定要执行的语句的顺序。那是对的吗?

时间:2015-02-09 18:47:28

标签: database oracle rollback liquibase

我有一个进程,其中对db进行的每个更改都在其自己的sql文件中更新,并且sql文件在其自己的changeset.xml中引用。例如table1.sql有一个table1.xml,它使用<sql>标记来引用该sql。 table1.sql对数据库上的table1对象进行了一些更改。

假设有一堆对象正在更新,触发器引用table1,包规范和主体引用table1以及引用table1的约束。这些对象的sql语句在各自的sql文件中,如trigger1.xml中引用的trigger1.sql,constraint1.xml中引用的constraint1.sql等。

现在,各个xmls的回滚语句只关注该对象。例如,trigger1.xml具有rollback标记只是为了删除trigger1,类似地,constrain1.xml只有dropback标记才能删除constraint1。

所有changelog xmls都在master xml中排序,它决定了更新顺序,例如包括first table1.xml,constrain1.xml,trigger1.xml等。

我的问题是,我坚持使用这种方法或liquibase本身,因为,rollbackSQL命令不会以正确的顺序生成sqls,如先丢弃触发器,先丢弃约束,然后最后删除table1。假设复杂变化的更大场景与其他无法回滚的对象相互依赖,因为订单不够智能。

如何处理这种情况?是否建议采用不同的方法?

1 个答案:

答案 0 :(得分:2)

您是对的 - Liquibase不会尝试重新排序变更集。它们按照更改日志中列出的顺序运行。