Liquibase中onFail:CONTINUE未按预期生效问题咨询
问题:Liquibase预条件未按预期跳过删除唯一约束操作
预期行为:当person表不存在person_name_key唯一约束时,Liquibase跳过删除该约束的操作。
实际执行时出现以下错误:
ERROR: Exception Details ERROR: Exception Primary Class: ValidationFailedException ERROR: Exception Primary Reason: Validation Failed: 1 preconditions failed Preconditions Failed db/changelog/per-tenant/db.changelog-tenant.yaml : person_name_key on person() does not exist
当前使用的变更集代码:
databaseChangeLog: - objectQuotingStrategy: QUOTE_ONLY_RESERVED_WORDS - preConditions: - onFail: CONTINUE - uniqueConstraintExists: constraintName: person_name_key schemaName: ${schema} tableName: person uniqueColumns: name - changeSet: id: 000.2605121336__DropUniqueConstraintFromPersonName author: db_admin changes: - dropUniqueConstraint: constraintName: person_name_key schemaName: ${schema} tableName: person uniqueColumns: name
问题原因
- 预条件作用域错误:当前
preConditions与changeSet平级,属于全局预条件,而非当前变更集的专属预条件,检查失败时直接终止整个变更日志执行。 - 预条件结构错误:
onFail: CONTINUE被作为独立条目,未关联到uniqueConstraintExists检查,实际未生效,预条件失败时触发了默认的FAIL行为。
修正后的变更集
将预条件嵌套到changeSet内部,并调整结构让onFail正确关联约束检查:
databaseChangeLog: - objectQuotingStrategy: QUOTE_ONLY_RESERVED_WORDS - changeSet: id: 000.2605121336__DropUniqueConstraintFromPersonName author: db_admin preConditions: - onFail: CONTINUE uniqueConstraintExists: constraintName: person_name_key schemaName: ${schema} tableName: person uniqueColumns: name changes: - dropUniqueConstraint: constraintName: person_name_key schemaName: ${schema} tableName: person uniqueColumns: name
说明
- 把
preConditions放到changeSet下,确保预条件仅对当前变更集生效,检查失败时只会跳过该变更集,而非终止整个流程。 - 将
onFail: CONTINUE作为uniqueConstraintExists检查的属性,明确指定约束不存在时跳过删除操作。
内容的提问来源于stack exchange,提问作者Ivan Karotki
相关产品推荐
相关产品推荐

