2015-10-07 2 views
2

У меня есть набор изменений для создания индекса.как воссоздать индекс, если он уже существует с Liquibase

<changeSet author="hilland" id="x-NC-U-y" runOnChange="true"> 
    <createIndex indexName="NC-U-y" tableName="x" unique="true"> 
     <column name="y"/> 
    </createIndex>  

    <rollback> 
     <dropIndex .../> 
    </rollback> 

    <modifySql> 
     <append value=" INCLUDE ([a],[b]) WITH (DATA_COMPRESSION=page)"/> 
    </modifySql> 
</changeSet> 

Проблема заключается в том, что старая версии индекса могущества существует (он будет на некоторых целях (Dev сервера, с более старой версией этого индекса, не включает в себя), не будет на других (например, свежие развернуть в пустую базу данных).

есть ли лучший способ решить эту проблему, так что сценарий становится универсальным, чем включать префикс, который говорит

<sql>IF select {sys.indexes.stuff} is not null {drop the index}</sql>? 

в идеале было бы предварительным условие для раскрывающегося если существует e xisting index, чтобы его можно было воссоздать, но я не думаю, что это можно сделать.

Каков наилучший способ справиться с этой ситуацией?

альтернативное решение, которое, как я думал, будет иметь отдельный changest «если индекс v1 существует, отбросьте его», тогда у вас будет отдельный набор изменений v2, но тогда это будет делать откаты.

Я понимаю, что условие выполнения изменений для набора изменений делает откаты жестким, но единственный откат, с которым я связан в этом случае, относится к пустой базе и из нее, хотя шаблон, который легко переносит откат к предыдущей версии, добро пожаловать также.

ответ

1

Вы можете выполнять изменения в зависимости от предусловия. Ваш может ревизии выглядеть следующим образом:

<changeSet> 
    <preConditions onFail="MARK_RAN"> 
     <indexExists name="NC-U-y" /> 
    </preConditions> 
    <dropIndex name="NC-U-y" /> 
</changeSet> 

Смотрите также Liquibase Documentation.

+0

2 вопроса здесь; 1) Я бы очень * тщательно перешел из моей нынешней структуры без этого и уже развернутых индексов, в новый журнал изменений с этим защитником, поскольку простое добавление этого набора изменений приведет к тому, что он будет выполнять и удалять индекс без последующей обработки выполненный набор изменений для его повторного запуска. вторая проблема, если бы я захотел изменить уже развернутый индекс, как эта команда изменений будет снова реализована? Мой текущий пользовательский sql выполняет drop if и только если (индекс существует, и я собираюсь создать его новую версию) –

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