Что все шаги Liquibase выполняет при откате?
Я не понимаю подробных шагов при откате с использованием Liquibase.
У меня был сценарий, как 6 наборов изменений, и для одного набора изменений откат не был определен, то есть только <rollback/>
в пределах набора изменений.
После выполнения с помощью deployIT я мог видеть 7 записей в таблице Databasechangelog, 6 для добавления, одну для создания тегов из-за использования deployIT.
После отката я увидел поведение удаления всех вновь добавленных 6 наборов изменений, даже если у одного из шести наборов изменений был пустой тег отката.
Пожалуйста, любой эксперт, скажите мне, почему? Каково точное поведение отката?
В целом хотите знать, когда удаляются записи из Databasechangelog?
2 ответа
При запуске отката liquibase находит наборы изменений для отката, а затем проверяет наличие <rollback>
в каждом теге описано как откатить набор изменений обратно.
Если нет <rollback>
тег, затем Liquibase проверяет, есть ли изменения в наборе изменений встроенной логикой о том, как откатиться. Как указывал Gile, если в изменении достаточно информации, чтобы отменить его (например, как у изменения createTable есть имя таблицы, необходимое для удаления таблицы), оно сможет откатить их обратно.
Но если в изменении недостаточно информации (например, почему у dropTable нет информации, необходимой для воссоздания таблицы), команда отката не будет выполнена с ошибкой "невозможно откатить".
Итак, логика отката:
- Используйте то, что определено в блоке
- Если нет блока отката, попробуйте сделать вывод, что нужно
- Если для отката недостаточно информации, выйдите перед откатом
Если вы укажете пустой блок отката, вы скажете Liquibase "логика, необходимая для отката - ничего не делать", поэтому Liquibase с радостью выполнит команду отката no-op и пометит changeSet как откат.
В зависимости от ваших наборов изменений, вы можете упасть в случае операторов, у которых команды отката генерируются автоматически, как в документации Liquibase Rollback:
Многие рефакторинги, такие как "создать таблицу", "переименовать столбец" и "добавить столбец", могут автоматически создавать операторы отката. Если ваш журнал изменений содержит только операторы, которые соответствуют этой категории, ваши команды отката будут сгенерированы автоматически.
Другие рефакторинги, такие как "удаление таблицы" и "вставка данных", не имеют соответствующих команд отката, которые могут быть сгенерированы автоматически. В этих случаях и в тех случаях, когда вы хотите переопределить сгенерированные по умолчанию команды отката, вы можете указать команды отката через тег внутри тега changeSet. Если вы не хотите, чтобы что-либо было сделано, чтобы отменить изменение в режиме отката, используйте пустой тег.
На http://forum.liquibase.org/topic/understanding-rollback вы можете найти более подробную информацию и другие ссылки.