failOnError
The failOnError
attribute defines whether a database migration will fail if an error occurs while executing the changeset. The default value is true
.
Uses
Normally, if you run the update command and Liquibase detects an error in a changeset, the migration fails. However, if you set failOnError
to false
on a changeset, Liquibase suppresses all error caching for that changeset, so the migration continues as though there were no error.
Some databases contain complex logic or objects added outside of Liquibase that may cause certain changesets to fail. To ensure your migrations succeed, it is a best practice to write one or more preconditions that control the execution of these changesets. However, if the precondition(s) would be very complicated to write, it may be more convenient to set failOnError
to false
on the affected changesets.
If you have a changeset that only runs successfully with certain databases or environments, it is also possible to set failOnError
on it as a "quick fix" to control its execution. However, instead of relying on failOnError
, it is a best practice to use the dbms
attribute to control whether a changeset applies to different databases. Similarly, it is a best practice to use contexts or labels to control changeset execution across multiple environments, such as test
versus dev
.
Tip: If you use failOnError
frequently, consider whether there are any underlying issues with your database architecture that you can address instead.
Using failOnError
with --rollback-on-error
(Liquibase Pro)
You can use the failOnError
changeset attribute with the update
command argument --rollback-on-error
. The following table displays the outcomes of running update
on a changeset that contains an error based on each possible configuration.
failOnError value |
--rollback-on-error value |
Migration state | Rollback behavior |
---|---|---|---|
true
|
true
|
Fails | All changes in the migration are rolled back * |
true
|
false
|
No rollback | |
false
|
true
|
Continues | |
false
|
false
|
Note: --rollback-on-error
requires a Liquibase Pro license key to use. For more information, see How to Apply Your Liquibase Pro License Key.
* If you use --rollback-on-error=true
, by default Liquibase does not roll back partially deployed changesets, such as a changeset containing one change with an error and one change without an error. In Liquibase Pro 4.25.0 and later, you can use the update
argument --force-on-partial-changes=true
alongside --rollback-on-error=true
to roll back these partially deployed changesets containing errors.
Syntax
Note: All changelog attributes use the camelCase
format.
--liquibase formatted sql
--changeset adrian:1 failOnError:false
create table company (
id int primary key,
address varchar(255)
);
{
"databaseChangeLog": [
{
"changeSet": {
"id": "1",
"author": "adrian",
"failOnError": "false",
"changes": [
{
"createTable": {
"tableName": "company",
"columns": [
{
"column": {
"name": "address"
}
}
]
}
}
]
}
}
]
}
databaseChangeLog:
- changeSet:
id: 1
author: adrian
failOnError: false
changes:
- createTable:
tableName: company
columns:
- column:
name: address
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
http://www.liquibase.org/xml/ns/pro
http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd">
<changeSet id="1" author="adrian" failOnError="false">
<createTable tableName="company">
<column name="address" type="varchar(255)"/>
</createTable>
</changeSet>
</databaseChangeLog