Може ли 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" на релация " лимит" вече съществува в 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) в .apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)

Имайте предвид, че този файл за промяна включва множество changeSets. Когато проверявам схемата, изглежда, че промените от някои от changeSets са приложени, но някои от другите нямат приложени промени.

И така, има ли начин да кажете на liquibase (за предпочитане чрез плъгина Maven) да игнорира неуспешните changeSets и да продължи?

Или (по-малко полезно) има ли начин да кажете на liquibase да приложи някои changeSets, а не други?

Благодаря!!!


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, за да му кажете да изпълни chanset по погрешка само ако колоната не съществува. Ще трябва да използвате етикета 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