modifyChangeSets

The modifyChangeSets tag lets you include SQL scripts in your Liquibase changelog while using an application's native executor—like PSQL, SQL Plus, or SQLCMD—instead of the JDBC default to deploy raw SQL scripts with a native executor. This removes the burden of converting raw SQL scripts into formatted SQL changelogs. You can use it to specify an overarching executor for all files in your project. It is available in Liquibase 4.18.0+.

Uses

If you have many changesets that need to be run with a native executor, and you organize your changelogs in a "root" and "nested" format using the include and includeAll tags, you can use the runWith attribute (PSQL, SQLPlus, or SQLCMD) to specify an executor that applies to every changeset in every file wrapped in the modifyChangeSets tag. Since your nested changelogs inherit the executor specified in modifyChangeSets, you don't have to specify it on each individual changeset you include.

Note: include and includeAll tags are available only in structured changelogs (XML, YAML, JSON). This is an existing limitation not introduced by modifyChangeSets.

If you want to make an exception for a particular changeset you're including, you can specify the default Liquibase JDBC executor for that changeset. All other changesets still run with the executor inherited from modifyChangeSets.

You can still include additional files in your root changelog outside of the modifyChangeSets tag. These files run with the Liquibase JDBC executor.

Run modifyChangeSets

To run this Change Type, follow these steps:

  1. Add the Change Type to your changeset, as shown in the examples on this page.
  2. Specify any required attributes. Use the table on this page to see which ones your database requires.
  3. Deploy your changeset by running the update command:
  4. liquibase update

Syntax

Attributes

Attribute Value Notes
runWith jdbc Default value if none specified. See Class JdbcExecutor.
mongosh Executor for MongoDB. See Use Native Executors with MongoDB Pro.
psql Executor for PostgreSQL. See Use Native Executors with PostgreSQL.
sqlplus Executor for Oracle. See Use Native Executors with Oracle Database.
sqlcmd Executor for MSSQL Server. See Use Native Executors with Microsoft SQL Server.
<custom> Custom executor. See Add a Native Executor.
Attribute Description Required for Supports
endDelimiter

Specifies delimiter to apply to the end of the statement. Your delimiter string can be a combination of one or more letters, symbols, and/or numbers, or the empty string (""). Default: ";".

Tip: It is a best practice not to use endDelimiter on changesets you are running with a native executor. Native executors handle delimiters natively.

In Liquibase 4.25.1, you can use endDelimiter with modifyChangeSets to apply a delimiter to all changesets you reference with include and includeAll.

endDelimiter is similar to the --pro-global-end-delimiter argument, but has a local scope. If both arguments are set, they follow the following precedence:

  1. endDelimiter set on a specific changeset (highest precedence)
  2. endDelimiter set in a changelog called by include or includeAll in modifyChangeSets
  3. --pro-global-end-delimiter set globally (lowest precedence)
none all

Nested tags

Name Description Required for Supports
include Includes the specified changelog none all
includeAll Includes the specified directory of changelogs none all

Examples

<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">

    <modifyChangeSets runWith="sqlplus" endDelimiter="@">
        <include file="my/nested/changelog.xml" />
        <includeAll path="release200/changelogs/sql" />
    </modifyChangeSets>

    <include file="sql/another.sql"/>
</databaseChangeLog>
databaseChangeLog:
- modifyChangeSets:
    runWith: sqlplus
    endDelimiter: @
    include:
      - file: my/nested/changelog.xml
    includeAll:
      - path: release200/changelogs/sql
- include:
    file: sql/another.sql
{
    "databaseChangeLog": [
        {
            "modifyChangeSets": {
                "runWith": "sqlplus",
                "endDelimiter": "@",
                "include": {
                    "file": "my/nested/changelog.xml"
                },
                "includeAll": {
                    "path": "release200/changelogs/sql"
                }
            },
            "include": {
                "file": "sql/another.sql"
            }
        }
    ]
}

Example: deploy a single raw SQL file

<modifyChangeSets runWith="psql">
	<include file="my-psql-script.sql" relativeToChangelogFile="true"/>
</modifyChangeSets>
databaseChangeLog:
- modifyChangeSets:
  - runWith: psql
  - include:
	   file: my-psql-script.sql
       relativeToChangelogFile: true
{  
  "databaseChangeLog": [
  "modifyChangeSets":
    {
      "runWith": "psql",
      "include": {"file": "my-psql-script.psql"},
      "relativeToChangeLogFile": {"true"}
					
    }
 ]
}

Example: deploy a directory of raw SQL files

<modifyChangeSets runWith="psql">
	<includeAll path="raw-psql-scripts-directory"/>
</modifyChangeSets>
databaseChangeLog:
- modifyChangeSets:
  - runWith: psql
  - includeAll:
       path: /raw-psql-scripts-directory
{  
  "databaseChangeLog": [
  "modifyChangeSets":
    {
      "runWith": "psql",
      "includeAll": {"path": "raw-psql-scripts-directory"}
					
    }
 ]
}

Related links