'How to reference the default schema in liquibase preCondition sqlCheck
Posting here in case it helps someone.
TLDR: ${database.defaultSchemaName} within sqlCheck to access default schema name
I wanted my database changeset to first check if a certain row is present in the database. If not present, it should execute the changeset.
Example:
myschema.customers:
| uuid | name | age |
|---|---|---|
| 0001 | Bob | 22 |
| 0002 | Sally | 25 |
What I want: liquibase to check if uuid = 0002 is present in the myschema.customers table. If so, run the changeset, otherwise skip over it.
Initially I tried this:
<changeSet id="00000000000007" author="jhipster">
<preConditions onFail="MARK_RAN">
<sqlCheck expectedResult="0">
select count(*) from customers WHERE uuid= '0002'
</sqlCheck>
</preConditions>
<insert tableName="customers">
<column name="uuid" value="0002"></column>
<column name="name" value="Sally"></column>
<column name="age" value="25"></column>
</insert>
</changeSet>
Bear in mind that I have set the following configuration for liquibase (4.6.1)
spring:
liquibase:
default-schema: myschema
But it seems precondition sqlcheck was checking public.customers and not myschema.customers. This would cause an error when uuid 0002 is already present in myschema.customers.
SOLUTION: use ${database.defaultSchemaName}
<preConditions onFail="MARK_RAN">
<sqlCheck expectedResult="0">
select count(*) from ${database.defaultSchemaName}.customers WHERE uuid= '0002'
</sqlCheck>
</preConditions>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
