声明diffChangeLog时,没有索引的Liquibase diff会失败

时间:2015-08-24 17:36:43

标签: indexing diff liquibase

我是liquibase的新手,我正在玩diff命令。它工作得非常好,但最近发现了这一点,我无法弄清楚为什么它在这个特定的环境中无法运作。

所以主要的问题是我想要比较两个数据库,但没有索引。这些是在主键上动态生成的,并获得不同的名称,但实际上是等效的。 liquibase不明白所以我想在没有索引的情况下运行diff。

所以我把它添加到我的pom.xml:

<diffTypes>tables, views, columns, primaryKeys, foreignKeys, uniqueconstraints</diffTypes>

它按预期运行,liquibase不比较索引。

在下一步中,我想生成diff作为changelog,所以我添加了一个diffChangeLog-File

<diffTypes>tables, views, columns, primaryKeys, foreignKeys, uniqueconstraints</diffTypes>
<diffChangeLogFile>src/main/diffs/diff_test.xml</diffChangeLogFile>

运行liquibase:diff时,它失败了:

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.4.1:diff (default-cli) on project liquibase_artifactID: Error setting up or running Liquibase: liquibase.command.CommandExecutionException: liquibase.exception.UnexpectedLiquibaseException: Could not resolve MissingObjectChangeGenerator dependencies due to dependency cycle. Dependencies:
[ERROR] [] -> Catalog -> []
[ERROR] [] -> Schema -> []
[ERROR] [Index] -> ForeignKey -> []
[ERROR] [] -> UniqueConstraint -> []
[ERROR] [] -> Column -> []
[ERROR] [] -> Table -> []
[ERROR] [] -> PrimaryKey -> []
[ERROR] [] -> View -> []
[ERROR] -> [Help 1]

为什么liquibase会这样?是非法的#34;生成没有索引的diffChangeLog?

当包含diffTypes的索引时,它可以工作,但生成的Changelog不可用,因为liquibase想要使用createIndex和dropIndex更改索引。但是这些语句不可执行(它无法删除主键上的索引,并且当它已经存在时无法创建索引)。

如何在没有索引的情况下生成可用的更改日志?或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

问题的答案在于异常消息:

Could not resolve MissingObjectChangeGenerator dependencies due to dependency cycle.

然后列出依赖项。

在内部,Liquibase正在生成依赖关系的有向图,并确保所有依赖关系都得到满足。如果您希望查看执行此操作的代码,请参阅课程DiffToChangeLog及其内部私有课程DependencyGraph