Может ли Liquibase обрабатывать частично обновленную схему?

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

Существует файл изменений Liquibase, который вносит ряд изменений, необходимых для запуска кода, но похоже, что в связанной схеме применены некоторые изменения.

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

Ошибка, которую я получаю, заключается в следующем:

СЕРЬЕЗНЫЙ 12/12/12 12:15:liquibase: Ошибка набора изменений db/changelogs/linechanges.xml::14::limit. Ошибка: ошибка при выполнении SQL ALTER TABLE limit ADD id serial: ОШИБКА: столбец "id" отношения "lineitem_limitgroup" уже существует liquibase.exception.DatabaseException: ошибка при выполнении SQL ALTER TABLE limit ADD id serial: ОШИБКА: столбец "id" отношения " limit" уже существует в liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:62) в liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:104) в liquibase.database.AbstractDatabase.execute(AbstractDatabase.java :1075) в liquibase.database.AbstractDatabase.executeStatements(AbstractDatabase.java:1059) в liquibase.changelog.ChangeSet.execute(ChangeSet.java:317) в liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:27) в liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:58) в liquibase.Liquibase.update(Liquibase.java:113) в org.liquibase.maven.plugins.LiquibaseUpdate.doUpdate(LiquibaseUpdate.java:31) в org. liquibase.maven.plugins.AbstractLiquibaseU pdateMojo.performLiquibaseTask(AbstractLiquibaseUpdateMojo.java:24) в org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute(AbstractLiquibaseMojo.java:302) в org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) в org .apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)

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

Итак, есть ли способ сообщить liquibase (желательно через плагин Maven) игнорировать неудачные наборы изменений и продолжить?

Или (менее полезно) есть способ сказать liquibase применять одни наборы изменений, а не другие?

Спасибо!!!


person Kramer    schedule 12.12.2012    source источник


Ответы (3)


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

Было сказано, что :

В своем журнале проверьте, добавляет ли какой-либо другой набор изменений этот столбец. Да, есть способы указать Liquibase применить некоторые изменения, а не другие.

Один обходной путь: поскольку в вашем файле уже есть проблемы, вы можете внести все предыдущие изменения, чтобы они соответствовали любому правильно выполненному набору изменений. Поскольку уникальная идентификация набора изменений основана на - автор, изменение, changeSetID. Поскольку это было запущено один раз, оно не будет запущено снова, независимо от того, какой sql находится внутри него.

person ND27    schedule 26.02.2014
comment
я полностью согласен... офигенно... :) - person Gyandeep; 08.03.2014

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

person Christoph Leiter    schedule 13.12.2012

Я думаю, что ваш лучший вариант - использовать предварительное условие Liquibase, чтобы указать ему запускать набор каналов по ошибке, только если столбец не существует. Вам нужно будет использовать тег columnExists следующим образом:

<preConditions>
  <not>
    <columnExists columnName="id" tableName="limit" schemaName="yourSchemaNameHere" />
  </not>
</preConditions>

Он пометит сценарий как выполненный без фактического запуска какого-либо обновления, если у вас уже есть столбец id в таблице ограничений.

У вас также есть два других варианта:

Первый вариант. Вы можете установить для атрибута failOnError значение false для наборов изменений, которые вызывают ошибку. Подверженные ошибкам наборы изменений будут запущены до момента, когда они вызовут ошибку. Следующие наборы изменений будут работать нормально.

Используйте это с осторожностью, так как он не отменяет набор изменений при ошибке и не помечает набор изменений как запущенный. Также обратите внимание, что если у вас уже есть набор изменений с этим атрибутом, установленным в false, это может объяснить, почему у вас есть частичное обновление.

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

person user327961    schedule 08.04.2013