Вопрос по database, maven-plugin, liquibase – Как пометить набор изменений в liquibase для отката

25

Я настроил плагин maven для liquibase, как указано вконфигурация maven.
Теперь создали набор изменений, как: -

<changeSet id="changeRollback" author="nvoxland">
  <createTable tableName="changeRollback1">
     <column name="id" type="int"/>
  </createTable>
  <rollback>
     <dropTable tableName="changeRollback1"/>
  </rollback>
</changeSet>

Создал sql для обновления БД с помощью командной строки: - mvn liquibase:updateSQL

Но я просто хочу знать, как выполнить откат, используя & quot; rollbackTag & quot; параметр. т.е. если запустить команду & quot;mvn liquibase:rollbackSQL& quot ;, каким должно быть значение & quot; rollbackTag & quot; параметр.

И возможно ли откат с помощью идентификатора набора изменений?

Вы не Натон Воксланд :-) Mark O'Connor

Ваш Ответ

2   ответа
16

ий, поэтому, если вам придется откатить или удалить все записи вDATABASECHANGELOG Вы не потеряете свои записи тегов.

<databaseChangeLog>
    <changeSet id="001_create_tables" .../>
    <changeSet id="002_alter_tables" .../>
    <changeSet id="003_load_user_data" .../>

    <!-- Also include the tagging itself as a changeSet... -->
    <changeSet author="userId" id="tag_version_0_1_0">
        <tagDatabase tag="version_0.1.0" />
    </changeSet>
    <!-- version 0.1.0 ends here -->

</databaseChangeLog>
Вы пытались запустить команду rollbackSQL непосредственно из командной строки liquibase? просто чтобы быть уверенным, что текущее состояние вашей схемы БД и состояние, на которое ссылается ваш тег, различны, и поэтому команда должна выполнить некоторый SQL.
@kothvandir вы можете ответитьstackoverflow.com/questions/41585052/…
Я запустил его, используя плагин Maven. Но я мог видеть, что тег был добавлен в сгенерированный SQL при запуске цели updateSQL, и я обновил базу данных вместе с ней. Я уверен, что теги не отличаются. Manu
Должна ли база тегов всегда содержаться в собственном теге changeSet?
Большое спасибо. Я создал maven goal & lt; goal & rollbackSQL & lt; / goal & gt; и в конфигурацию добавлен тег & lt; rollbackTag & gt; version_0.1.0 & lt; rollbackTag & gt ;. Но когда я запускаю цель rollbackSQL, она не генерирует скрипт отката. Но если я укажу количество отката, используя & lt; rollbackTag & gt; 2 & lt; / rollbackCount & gt; сценарии отката создаются для двух последних наборов изменений. Есть идеи, почему скрипт отката не генерируется? Manu
40

Следующие команды откатят конфигурацию базы данных на 3 набора изменений и создадут тег с именем & quot; контрольная точка & quot ;:

mvn liquibase:rollback -Dliquibase.rollbackCount=3
mvn liquibase:tag -Dliquibase.tag=checkpoint

Теперь вы можете обновить базу данных и на любом этапе выполнить откат до этой точки с помощью тега отката:

mvn liquibase:rollback -Dliquibase.rollbackTag=checkpoint

или альтернативно сгенерируйте откат SQL:

mvn liquibase:rollbackSQL -Dliquibase.rollbackTag=checkpoint
Revised example

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

Обновление liquibase настроено на автоматический запуск с последующей маркировкой базы данных по текущему номеру ревизии Maven.

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.myspotontheweb.db</groupId>
    <artifactId>liquibase-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <!-- Liquibase settings -->
        <liquibase.url>jdbc:h2:target/db1/liquibaseTest;AUTO_SERVER=TRUE</liquibase.url>
        <liquibase.driver>org.h2.Driver</liquibase.driver>
        <liquibase.username>user</liquibase.username>
        <liquibase.password>pass</liquibase.password>
        <liquibase.changeLogFile>com/myspotontheweb/db/changelog/db-changelog-master.xml</liquibase.changeLogFile>
        <liquibase.promptOnNonLocalDatabase>false</liquibase.promptOnNonLocalDatabase>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.162</version>
        </dependency>
    </dependencies>
    <profiles>
        <profile>
            <id>dbupdate</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.liquibase</groupId>
                        <artifactId>liquibase-maven-plugin</artifactId>
                        <version>2.0.2</version>
                        <executions>
                            <execution>
                                <phase>process-resources</phase>
                                <configuration>
                                    <tag>${project.version}</tag>
                                </configuration>
                                <goals>
                                    <goal>update</goal>
                                    <goal>tag</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Liquibase теперь настроен как часть стандартного жизненного цикла, поэтому его можно запустить следующим образом:

mvn clean compile
@gfghj пример обновляется по запросу
большое спасибоMark O'Connor, В приведенной выше конфигурации возможно ли добавить тег Manu
Привет, я попробовал реализацию с тегами liquibase на этапе жизненного цикла maven и заметил, что LB вставил отдельную строку db в таблицу DATABASECHANGELOG для тега. Это нормально, или мне нужно дополнительно настроить выполнение maven, чтобы сделать его правильным? Строка db для тега: 1480674890164, liquibase, liquibase-internal, 2016-12-02 12: 34: 50,1, EXECUTED, 7: d41d8cd98f00b204e9800998ecf8427e, Пусто, 0.0.1-SNAPSHOT, 3.2.2
При попытке создать RollbackSQL я получил сообщение об ошибке: - [INFO] Ошибка при настройке или запуске Liquibase: liquibase.exception.RollbackImpossibleException: Нет обратного к liquibase.change.core.UpdateDataChange создан Manu
@ gfghj Это действительно новый вопрос. Ваша проблема в том, что у вас есть набор изменений, у которого нет опции автоматического отката. Проверьте страницу документации по рефакторингу.liquibase.org/manual/refactoring_commands, Каждое действие будет указывать, есть ли опция автоматического отката. Проблема устранена путем указания собственного & quot; отката & quot; раздел внутри ревизии

Похожие вопросы