Как я могу установить схему в триггере с параметром?

1

Здесь я устанавливаю схему, которая использует набор изменений 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>
Теги:
spring
triggers
liquibase

1 ответ

2

Как отметил @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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню