Регистрация арендатора с liquibase-sql игнорирует схему - PullRequest
0 голосов
/ 06 января 2019

Я использую пружинную загрузку 2.0.6, s4sdk, liquibase и postgres.

Несмотря на то, что я явно установил database.defaultSchemaName, liquibase пытается создать таблицы в публичной схеме.

Это происходит только в том случае, если я использую SQL-возможность liquibase для создания таблиц, например:

CREATE TABLE "T_SAMPLE"(
"SAMPLE_ID" VARCHAR(255) NOT NULL,
"VALUE" VARCHAR(255),
PRIMARY KEY (
    "SAMPLE_ID"
)

);

Если я использую yaml-возможность liquibase, таблицы создаются в правильной схеме.

Как схема учитывается при использовании SQL?

Может быть, есть возможность использовать какие-то параметры в SQL, которые можно заменить?

CREATE TABLE <SCHEMA>."T_SAMPLE"...

Я использую следующий код для подписки нового арендатора:

    @Override
public void subscribeTenant(final String tenantId) {
    String defaultSchemaName;
    try {
        Validate.isTrue(isValidTenantId(tenantId), String.format("Invalid tenant id: \"%s\"", tenantId));
        final String schemaName = TenantUtil.createSchemaName(tenantId);

        final Connection connection = dataSource.getConnection();
        final Database database =
                DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
        database.setObjectQuotingStrategy(ObjectQuotingStrategy.QUOTE_ALL_OBJECTS);

        try (Statement statement = connection.createStatement()) {
            statement.execute(String.format("CREATE SCHEMA IF NOT EXISTS \"%s\"", schemaName));
            connection.commit();

            defaultSchemaName = database.getDefaultSchemaName();
            database.setDefaultSchemaName(schemaName);
            database.setOutputDefaultSchema(true);

            final String filePath = LIQUIBASE_PATH;
            final Liquibase liquibase = new Liquibase(filePath, new ClassLoaderResourceAccessor(), database);

            liquibase.update(new Contexts(), new LabelExpression());
            //fillTenantDefaultValues(tenantId);
            database.setDefaultSchemaName(defaultSchemaName);

        } catch (SQLException | LiquibaseException | IllegalArgumentException e) {
            final BadRequestException badRequestException = new BadRequestException();
            logger.error("Tenant subscription failed for {}.", tenantId, e);
            throw badRequestException;
        }
...