Здесь я устанавливаю схему, которая использует набор изменений Liquibase в Java/Spring. До этого момента он работал с созданием таблицы/ключа. Но он не работает на пользовательском SQL.
@Bean
@DependsOn("dataSource")
public SpringLiquibase liquibase() {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
liquibase.setChangeLog("classpath:META-INF/liquibase/application-changes.xml");
liquibase.setContexts("default");
liquibase.setDefaultSchema(databaseProperties.getJdbcSchema());
return liquibase;
}
Теперь мне нужно управлять большими объектами в Postgresql, поэтому я хочу добавить следующий набор изменений. Но у меня возникают проблемы, так как он не использует параметр, поэтому мне пришлось добавить "my_schema" в файл SQL. Кто-нибудь знает обходное решение или решение для этого?
<changeSet id="xxx-0.0.1-SNAPSHOT-postgres" runInTransaction="true" failOnError="true"
onValidationFail="HALT" dbms="postgresql">
<sql >
CREATE TRIGGER t_table BEFORE UPDATE OR DELETE ON my_schema.table
FOR EACH ROW EXECUTE PROCEDURE my_schema.lo_manage(content);
</sql>
</changeSet>
Как отметил @pozs, здесь есть решение: https://forum.liquibase.org/topic/setting-default-schema-working-for-xml-refactorings-but-not-sql
Таким образом, код, который делает эту работу, будет
@Bean
@DependsOn("dataSource")
public SpringLiquibase liquibase() {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
liquibase.setChangeLog("classpath:META-INF/liquibase/application-changes.xml");
liquibase.setContexts("default");
liquibase.setDefaultSchema(databaseProperties.getJdbcSchema());
liquibase.setChangeLogParameters(createChangeLogParameters());
return liquibase;
}
private Map<String, String> createChangeLogParameters() {
Map<String, String> map = new HashMap<String, String>();
map.put("defaultSchema", databaseProperties.getJdbcSchema()); // needed on SQL in <sql> tags.
return map;
}
И здесь Liquibase:
<changeSet id="xxx-0.0.1-SNAPSHOT-postgres" runInTransaction="true" failOnError="true"
onValidationFail="HALT" dbms="postgresql">
<sql >
CREATE TRIGGER t_table BEFORE UPDATE OR DELETE ON ${defaultSchema}.table
FOR EACH ROW EXECUTE PROCEDURE ${defaultSchema}.lo_manage(content);
</sql>