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