使用liquibase-sql租户入职会忽略架构

时间:2019-01-06 20:13:20

标签: liquibase s4sdk

我正在使用spring-boot 2.0.6,s4sdk,liquibase和postgres。

即使我显式设置了database.defaultSchemaName,liquibase也会尝试在公共架构中创建表。

仅当我使用liquibase的SQL可能性创建表时,才会发生此行为,例如:

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

);

如果我使用liquibase的yaml-possibility,则表是在正确的架构中创建的。

使用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;
        }

0 个答案:

没有答案