我遇到了Flyway 4.2.0中可重复Java迁移的问题。
例如,我编写了一个可重复的Java迁移,它为每个具有特定列的表创建一个触发器。此迁移的ChecksumProvider计算缺少触发器的表的连接名称的哈希码。
@Override
public int getChecksum(Connection conn) throws SQLException {
return queryTableNames(conn).stream().collect(Collectors.joining(",")).hashCode();
}
当表的列表为空时,哈希码为零,不应该执行任何操作。
当表的列表不为空时,哈希码不为零(将其命名为xxx),并且对于每个表,将适当的触发器添加到数据库中。 在这种情况下,hascode xxx被写入" schema_version"。 下一次flyway:信息被执行,它显示过时的迁移,因为所有触发器都存在且新的校验和为零。所以我必须做一个" flyway:repair"或者另外一个" flyway:migrate"得到一张干净的桌子" schema_version"。
是否有机会在Java可重复迁移后自动更新校验和?
我检查过FlywayCallback.afterEachMigrate,但是只有对MigrationInfo的只读访问权限。使用这种方法的进一步步骤将使用太多的飞路内部(即更新" schema_version"单独)。
实现自己的MigrationResolver和自定义的MigrationExecutor似乎太重了。
答案 0 :(得分:0)
校验和的定义是错误的。校验和应该引用当前的目标状态。
在示例中,方法queryTableNames()应返回具有此类触发器的所有表,并且迁移应使用所需的触发器完成这些表。