Я собираюсь решить эту проблему с CustomChange-Command:
public class AddForeignKeyConstraintWithIndex extends
liquibase.change.core.AddForeignKeyConstraintChange implements
liquibase.change.custom.CustomSqlChange {
@SuppressWarnings({"UnusedDeclaration", "FieldCanBeLocal"})
private ResourceAccessor resourceAccessor;
@Override
public void setUp() throws SetupException {
}
@Override
public void setFileOpener(ResourceAccessor resourceAccessor) {
this.resourceAccessor = resourceAccessor;
}
@Override
public SqlStatement[] generateStatements(Database database) {
SqlStatement[] result = super.generateStatements(database);
// Für Postgres zusätzlich Index anlegen
if (database instanceof PostgresDatabase) {
AddColumnConfig columnConfig = new AddColumnConfig();
columnConfig.setName(getBaseColumnNames());
columnConfig.setComputed(Boolean.FALSE);
SqlStatement createIndexStatement = new CreateIndexStatement(
"ix_" + getConstraintName(),
getBaseTableCatalogName(),
getBaseTableSchemaName(),
getBaseTableName(),
Boolean.FALSE,
null,
columnConfig
);
List<SqlStatement> list = new ArrayList<>(Arrays.asList(result));
list.add(createIndexStatement);
return list.toArray(new SqlStatement[list.size()]);
}
return result;
}
Затем вы можете вызвать эту CustomChange как это (с точно такими же, как Params для AddForeignKeyConstraint-выписки):
<customChange
class="eu.***.***.AddForeignKeyConstraintWithIndex"
baseTableName="tbl_interest_reference"
baseColumnNames="customer_id"
constraintName="finterest_ref_customer_fk"
referencedTableName="tbl_customer"
referencedColumnNames="customer_id"
/>
Спасибо за указание на предпосылки. Однако это кажется извилистым решением, так как мне придется вручную создавать все отсутствующие индексы для postgres. Кроме того, для каждого нового внешнего ключа, который будет представлен, нужно было бы также создать такой набор изменений postgres. – SebastianRiemer
Еще один недостаток в иллюзии портативности РСУБД. –
@SebastianRiemer да, согласен. Просто увидел, что есть пользовательский тег изменения: http://www.liquibase.org/documentation/changes/custom_change.html. Поэтому, если вы знакомы с Java, вы можете попытаться создать тег myForeignKey, который будет проверять поставщика базы данных и генерировать запрос для создания индекса, если это необходимо. – dbf