美好的一天!
我们有运行 liquibase 的 Java + Spring 应用程序。 目前正在将 liquibase 从 3.5.5 迁移到 4.8.0 版本。 使用下一个SpringLiquibase设置:
private static SpringLiquibase liquibase(Properties properties) throws IOException {
DataSource dataSource = datasource(properties);
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setChangeLog(properties.getProperty("liquibase.masterfile","classpath:master.xml"));
liquibase.setDataSource(dataSource);
liquibase.setResourceLoader(new DefaultResourceLoader());
liquibase.setClearCheckSums(true);
return liquibase;
}
通过将 ClearCheckSums 设置为 true 我期待像这里这样的行为 https://forum.liquibase.org/t/how-to-recalculate-checksums-without-re-running-the-statements-in-liquibase/5226/4 所以变更集的重新运行不应该发生。 CheckSums 已清理,但无论如何都会重新运行脚本。 我在这里想念什么?
在 Liquibase 中将 ClearCheckSums 设置为 true 意味着 Liquibase 将在下次应用程序启动时重新计算 changelog 文件中所有更改集的校验和。当您想将更改应用到数据库架构但不想执行任何已应用的更改集时,这很有用。
但是,将 ClearCheckSums 设置为 true 并不意味着 Liquibase 将跳过执行已经应用的变更集。如果你想跳过执行已经应用的变更集,你需要将 runOnChange="true" 添加到 changelog 文件中的 changeSet 定义。
例如: ... 使用 runOnChange="true",Liquibase 将仅在其校验和自上次执行后发生更改时才执行此变更集。这意味着如果您更新此变更集中的 SQL,Liquibase 将在下次应用程序启动时重新执行它,即使您将 ClearCheckSums 设置为 true。
因此,要实现不重新运行已经应用的脚本的预期行为,您应该将 ClearCheckSums 设置为 true,并将 runOnChange="true" 添加到您不想不必要地重新运行的任何变更集中。