customChange

The customChange type creates a custom Change Type class.

Uses

Although Liquibase provides a wide range of database Change Types, you may want to create your own custom Change Type class. The customChange type allows you to run the needed code within a changeset.

You can typically use the customChange Change Type to run your script when you want to:

  • Loop through all the tables in the database and convert datatypes
  • Download data from a webserver and insert it into your database
  • Change the lighting color in your data center
  • Perform the other needed custom features

The customChange type is the way to integrate your custom code into the changelog. To create your own custom Change Type by integrating the custom code, follow these steps:

  1. Create a java class that implements the liquibase.change.custom.CustomSqlChange or liquibase.change.custom.CustomTaskChange interface <customChange> tag in your changeset.

The example of a class

public class ExampleCustomTaskChange implements CustomTaskChange, CustomTaskRollback {
private String helloTo;
@SuppressWarnings({"UnusedDeclaration", "FieldCanBeLocal"})
    private ResourceAccessor resourceAccessor;
    public String getHelloTo() {
        return helloTo;
    }  
    public void setHelloTo(String helloTo) {
        this.helloTo = helloTo;
    }
    @Override
    public void execute(Database database) throws CustomChangeException {
        Scope.getCurrentScope().getLog(getClass()).info("Hello "+getHelloTo());
    } 
    @Override
    public void rollback(Database database) throws CustomChangeException, RollbackImpossibleException {
        Scope.getCurrentScope().getLog(getClass()).info("Goodbye "+getHelloTo());
    }
    @Override
    public String getConfirmationMessage() {
        return "Said Hello";
    }
    @Override
    public void setUp() throws SetupException {
    ;
    }
    @Override
    public void setFileOpener(ResourceAccessor resourceAccessor) {
        this.resourceAccessor = resourceAccessor;
    } 
    @Override
    public ValidationErrors validate(Database database) {
        return new ValidationErrors();
    }
}

Note: There is a settable helloTo and the execute(Database database) method in the class that is a part of the interface. You can put any code within the execute() method.

  1. Compile the created class, package it into a jar file, and then add it to a Liquibase classpath.
  2. Add the class to your changelog as it is shown in the examples:

XML example

<changeSet id="21" author="nvoxland">
        <customChange class="liquibase.change.custom.ExampleCustomTaskChange" helloTo="world"/>
 </changeSet>

YAML example

changeSet:
   id:  21
   author: nvoxland
   changes:
   -  customChange:  {
“class”: "liquibase.change.custom.ExampleCustomTaskChange",
“helloTo”: "world" }

JSON example

{
  "changeSet": {
  "id": "21",
  "author": "nvoxland",
  "changes": [
    {
       "customChange": {
 “class”: "liquibase.change.custom.ExampleCustomTaskChange",
 “helloTo”: "world"
         }
       }
     ]
   }
 }

When that changeset is executed, helloTo will be set to "world" and the execute() method will be called to run what you specified.

Note: If your change can be rolled back, implement the liquibase.change.custom.CustomSqlRollback as well.

CustomSqlChange and CustomTaskChange

The difference between CustomTaskChange and CustomSqlChange is the following:

  • In CustomTaskChange, you have the execute() method that executes the needed string.
  • In CustomSqlChange, there is a generateStatements(Database database method that doesn't execute the needed string but returns the SQL that should be run. This makes the custom change work better with the updateSQL command, which displays the SQL being run.

Database support

Database Notes Auto rollback
DB2/LUW Supported No
DB2/z Supported No
Derby Supported No
Firebird Supported No
H2 Supported No
HyperSQL Supported No
INGRES Supported No
Informix Supported No
MariaDB Supported No
MySQL Supported No
Oracle Supported No
PostgreSQL Supported No
SQL Server Supported No
SQLite Supported No
Sybase Supported No
Sybase Anywhere Supported No