Несколько предварительных условий

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

Сценарий №1: Если таблица A, B, C существует, пометьте как выполненную

Сценарий № 2: Если таблицы X, Y, Z не существует, остановите выполнение набора изменений

Другими словами, мне нужны два <preConditions> тега с разными предложениями onFail. Разрешено ли это вообще в Liquibase? Кажется, я не могу заставить его работать. документы не очень информативны.


person Kris Selbekk    schedule 18.09.2013    source источник


Ответы (3)


В настоящее время это запрещено. Может быть только один блок.

Можно ли разбить его на два отдельных набора изменений?

person Nathan Voxland    schedule 29.10.2013
comment
Мне нужно создать таблицу A в устаревшей БД. Эта таблица имеет внешний ключ для идентификатора таблицы B другой схемы. Если таблица А уже существует - MARK_RAN. Если не существует - отметьте B существует и отметьте Fail SKIP. - person Anton Feoktistov; 12.04.2018

Обходной путь, который я просто использовал:

  • создать нормальное предварительное условие

    <!-- pre-condition tests -->
    <preConditions onFail="WARN">
            <runningAs username="${db.maintenance.user}" />
    </preConditions>
    
  • создать пустой changeSet для другого уровня onFail

    <changeSet id="liquibase-pre-1" author="liquibase" runAlways="true" runOnChange="true" runInTransaction="false">
        <preConditions onFail="HALT" onFailMessage="...">
            <!-- ... -->
        </preConditions>
        <sql>
            select 1 <!-- (Postgresql) or "select 1 from dual" (Oracle) -->
        </sql>
    </changeSet>
    
person gudepier    schedule 24.02.2015

Объедините их с <or> или <and> следующим образом:

<preConditions>
    <or>
        <runningAs username="liquibase" />
        <runningAs username="sa" />
    </or>
</preConditions>

Здесь находится некоторая документация по предварительным условиям.

person Jens    schedule 18.09.2013
comment
Я уже делаю это, но это не совсем отвечает на мой вопрос. Как я могу установить два разных предложения onFail? - person Kris Selbekk; 18.09.2013
comment
Ой, извини. Не видел этого. Теперь, когда вы отредактировали вопрос, все ясно, но, к сожалению, у меня нет ответа. - person Jens; 19.09.2013
comment
Что на самом деле произойдет, если вы добавите 2 preConditions в набор изменений. Без каких-либо логических <or>, а затем определить onFail предложения? Просматривая исходный код liquibase.parser.core.xml.XMLChangeLogSAXHandler, я не вижу, что это может быть запрещено. Хотя я, конечно, не наблюдаю за всей логикой парсера журнала изменений. - person Jens; 19.09.2013
comment
В настоящее время это запрещено. Может быть только один блок ‹preConditions›. Можно ли разбить его на два отдельных набора изменений? - person Nathan Voxland; 26.09.2013
comment
Если в настоящее время это не разрешено, я получил свой ответ =) Спасибо! @NathanVoxland - пожалуйста, добавьте это как ответ, чтобы я мог отметить его как правильный. - person Kris Selbekk; 26.10.2013