2016-12-12 4 views
0

Мы используем ревизии linibase для поддержки использования MySQL и PostgreSQL; Теперь я наткнулся на то, что MySQL автоматически создает индексы для внешних ключей, где postgres этого не делает.Liquibase - создать индекс для внешних ключей postgresql

Вопрос: Как убедиться, что схема БД имеет индексы для всех внешних ключей независимо от того, какая БД фактически используется?

Update 28.02.2017 Вот ссылка на вопрос в форуме LiquiBase: http://forum.liquibase.org/#Topic/49382000001637005

ответ

1

Посмотрите на предпосылке 'DBMS' здесь: http://www.liquibase.org/documentation/preconditions.html. Вы можете поместить весь код postgesql.

+0

Спасибо за указание на предпосылки. Однако это кажется извилистым решением, так как мне придется вручную создавать все отсутствующие индексы для postgres. Кроме того, для каждого нового внешнего ключа, который будет представлен, нужно было бы также создать такой набор изменений postgres. – SebastianRiemer

+0

Еще один недостаток в иллюзии портативности РСУБД. –

+0

@SebastianRiemer да, согласен. Просто увидел, что есть пользовательский тег изменения: http://www.liquibase.org/documentation/changes/custom_change.html. Поэтому, если вы знакомы с Java, вы можете попытаться создать тег myForeignKey, который будет проверять поставщика базы данных и генерировать запрос для создания индекса, если это необходимо. – dbf

0

Я собираюсь решить эту проблему с 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" 
    /> 

 Смежные вопросы

  • Нет связанных вопросов^_^