Что все шаги Liquibase выполняет при откате?

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

У меня был сценарий, как 6 наборов изменений, и для одного набора изменений откат не был определен, то есть только <rollback/> в пределах набора изменений.

После выполнения с помощью deployIT я мог видеть 7 записей в таблице Databasechangelog, 6 для добавления, одну для создания тегов из-за использования deployIT.

После отката я увидел поведение удаления всех вновь добавленных 6 наборов изменений, даже если у одного из шести наборов изменений был пустой тег отката.

Пожалуйста, любой эксперт, скажите мне, почему? Каково точное поведение отката?

В целом хотите знать, когда удаляются записи из Databasechangelog?

2 ответа

Решение

При запуске отката liquibase находит наборы изменений для отката, а затем проверяет наличие <rollback> в каждом теге описано как откатить набор изменений обратно.

Если нет <rollback> тег, затем Liquibase проверяет, есть ли изменения в наборе изменений встроенной логикой о том, как откатиться. Как указывал Gile, если в изменении достаточно информации, чтобы отменить его (например, как у изменения createTable есть имя таблицы, необходимое для удаления таблицы), оно сможет откатить их обратно.

Но если в изменении недостаточно информации (например, почему у dropTable нет информации, необходимой для воссоздания таблицы), команда отката не будет выполнена с ошибкой "невозможно откатить".

Итак, логика отката:

  1. Используйте то, что определено в блоке
  2. Если нет блока отката, попробуйте сделать вывод, что нужно
  3. Если для отката недостаточно информации, выйдите перед откатом

Если вы укажете пустой блок отката, вы скажете Liquibase "логика, необходимая для отката - ничего не делать", поэтому Liquibase с радостью выполнит команду отката no-op и пометит changeSet как откат.

В зависимости от ваших наборов изменений, вы можете упасть в случае операторов, у которых команды отката генерируются автоматически, как в документации Liquibase Rollback:

Многие рефакторинги, такие как "создать таблицу", "переименовать столбец" и "добавить столбец", могут автоматически создавать операторы отката. Если ваш журнал изменений содержит только операторы, которые соответствуют этой категории, ваши команды отката будут сгенерированы автоматически.

Другие рефакторинги, такие как "удаление таблицы" и "вставка данных", не имеют соответствующих команд отката, которые могут быть сгенерированы автоматически. В этих случаях и в тех случаях, когда вы хотите переопределить сгенерированные по умолчанию команды отката, вы можете указать команды отката через тег внутри тега changeSet. Если вы не хотите, чтобы что-либо было сделано, чтобы отменить изменение в режиме отката, используйте пустой тег.

На http://forum.liquibase.org/topic/understanding-rollback вы можете найти более подробную информацию и другие ссылки.

Другие вопросы по тегам