Я использую пружинную загрузку 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;
}