Database / Liquibase interview questions
What is a Liquibase precondition and why would you use one?
A precondition is a condition that Liquibase checks before executing a changeSet or the entire changeLog. If the condition is not met, Liquibase can either halt execution, skip the changeSet, mark it as run, or issue a warning — depending on the onFail and onError settings. Preconditions let you write defensive migrations that check the actual database state before blindly executing DDL.
Common use cases:
- Verify a table or column already exists before trying to modify it (useful for changeSets that might have been applied manually in some environments).
- Check that a specific database type or version is in use before executing vendor-specific SQL.
- Confirm a required extension or configuration exists before proceeding.
<changeSet id="add-index-if-table-exists" author="eve"> <preConditions onFail="MARK_RAN"> <tableExists tableName="order_item"/> <not> <indexExists indexName="idx_order_item_product"/> </not> </preConditions> <createIndex tableName="order_item" indexName="idx_order_item_product"> <column name="product_id"/> </createIndex> </changeSet>
The onFail attribute controls what happens if the precondition is not met: HALT (stop everything), CONTINUE (skip this changeSet), MARK_RAN (record it as executed without running it), or WARN (log a warning and continue). Choosing the right onFail behavior is important — MARK_RAN is useful when a change may have been applied manually and you want Liquibase to catch up without re-applying, while HALT is appropriate for critical prerequisites.
More Related questions...