Liquibase - пользовательский параметр в выражении createView - PullRequest
0 голосов
/ 16 ноября 2018

Я настроил liquibase для работы с использованием мультитенанта схемы в postgresql. Он работает нормально, когда журнал изменений просто создает таблицу или структуры, которые зависят только от синтаксиса XML. Однако мне нужно создать несколько представлений, которые зависят от параметра defaultSchemaName , поэтому я попытался безуспешно:

<changeSet id="00000000000002_blog_views" author="hudson" dbms="postgresql">
    <createView viewName="blog_post_management_view" replaceIfExists="true">
            SELECT
              p.id,
              p.title,
              ba.name as author,
              p.status,
              p.created_date
            FROM ${defaultSchemaName}.blog_post p
              INNER JOIN ${defaultSchemaName}.blog_author ba ON p.author_id = ba.id
    </createView>
</changeSet>

Я получаю эту ошибку при выполнении вышеуказанного журнала изменений:

Caused by: liquibase.exception.DatabaseException: ERROR: syntax error at or near "$"
Position: 258 [Failed SQL: CREATE VIEW "c7a53124-0ca9-4ce4-a25d-34b1764ee9df".blog_post_management_view AS SELECT
              p.id,
              p.title,
              ba.name as author,
              p.status,
              p.created_date
            FROM ${defaultSchemaName}.blog_post p
              INNER JOIN ${defaultSchemaName}.blog_author ba ON p.author_id = ba.id]
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:309)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:113)
at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1277)
at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1259)
at liquibase.changelog.ChangeSet.execute(ChangeSet.java:582)
... 29 common frames omitted
Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "$"

Важно отметить, что мой бегун liquibase уже настроен с именем defaultSchemaName:

@Bean
@DependsOn("liquibase")
public MultiTenantSpringLiquibase multiTenantLiquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) {
    MultiTenantSpringLiquibase liquibase = new CustomMultiTenantSpringLiquibase();
    liquibase.setDataSource(dataSource);
    liquibase.setChangeLog("classpath:config/liquibase/master.xml");
    liquibase.setContexts(liquibaseProperties.getContexts());
    liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
    liquibase.setDropFirst(liquibaseProperties.isDropFirst());
    liquibase.setSchemas(getSchemas(dataSource));
    if (env.acceptsProfiles(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE)) {
        liquibase.setShouldRun(false);
    } else {
        liquibase.setShouldRun(liquibaseProperties.isEnabled());
        log.debug("Configuring Multi Tenant Liquibase");
    }
    liquibase.setParameters(DatabaseUtil.defaultParams(liquibaseProperties.getDefaultSchema()));
    return liquibase;
}

Есть ли способ использовать свойство или системную переменную любого типа в содержимом тега createView?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я понял, что мне нужно добавить параметр вручную, мне кажется, я не могу получить доступ только к параметру "defaultSchema", задавая свойство defaultSchema (liquibase.setDefaultSchema("something");):

 Map<String, String> parameters = new HashMap<>();
 parameters.put("schemaName", schema);
 liquibase.setChangeLogParameters(parameters);
0 голосов
/ 16 ноября 2018

Вы можете использовать имя схемы из файла свойств:

@Value("${spring.jpa.properties.hibernate.default_schema}")
private String schemaName;

Теперь вы можете использовать переменную schemaName в вашем коде.

...