如何在liquibase中标记变更集以进行回滚

Man*_*anu 27 database liquibase maven-plugin

我已经为maven配置中指定的liquibase配置了maven插件.
现在创建了一个变更集,如: -

<changeSet id="changeRollback" author="nvoxland">
  <createTable tableName="changeRollback1">
     <column name="id" type="int"/>
  </createTable>
  <rollback>
     <dropTable tableName="changeRollback1"/>
  </rollback>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

使用命令行创建了用于更新DB的sql: - mvn liquibase:updateSQL

但只是想知道如何使用"rollbackTag"参数回滚.即如果运行命令" mvn liquibase:rollbackSQL ",则应该是"rollbackTag"参数的值.

是否可以使用变更集ID进行回滚?

Mar*_*nor 44

回滚标记旨在检查数据库的配置.

以下命令将数据库配置回滚3个变更集,并创建一个名为"checkpoint"的标记:

mvn liquibase:rollback -Dliquibase.rollbackCount=3
mvn liquibase:tag -Dliquibase.tag=checkpoint
Run Code Online (Sandbox Code Playgroud)

您现在可以更新数据库,并在任何阶段使用rollback标记回滚到该点:

mvn liquibase:rollback -Dliquibase.rollbackTag=checkpoint
Run Code Online (Sandbox Code Playgroud)

或者生成回滚SQL:

mvn liquibase:rollbackSQL -Dliquibase.rollbackTag=checkpoint
Run Code Online (Sandbox Code Playgroud)

修改过的例子

我最初发现很难弄清楚如何配置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>
Run Code Online (Sandbox Code Playgroud)

Liquibase现在配置为标准生命周期的一部分,因此可以按如下方式运行:

mvn clean compile
Run Code Online (Sandbox Code Playgroud)

  • @gfghj这真的是一个新问题.您的问题是您有一个没有自动回滚选项的changset.查看重构文档网页.http://www.liquibase.org/manual/refactoring_commands.每个操作都将指示是否存在自动回滚选项.通过在变更集中指定您自己的"回滚"部分来解决问题 (2认同)

kot*_*dir 17

我个人更喜欢将标记作为变更集文件的一部分,因此如果您必须回滚或删除所有记录,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>
Run Code Online (Sandbox Code Playgroud)

  • tagDatabase是否应始终在其自己的changeSet标记中自包含? (3认同)
  • 非常感谢.我创建了maven目标<goal> rollbackSQL </ goal>,并在配置中添加了标签<rollbackTag> version_0.1.0 <rollbackTag>.但是当我运行目标rollbackSQL时,它没有生成回滚脚本.但是,如果我使用<rollbackTag> 2 </ rollbackCount>指定回滚计数,则会为最后两个更改集创建回滚脚本.知道为什么没有生成回滚脚本? (2认同)