【问题标题】:How to tag a changeset in liquibase to rollback如何在 liquibase 中标记变更集以进行回滚
【发布时间】:2012-06-21 05:26:20
【问题描述】:

我已经按照maven configuration 中的说明为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

但只想知道如何使用“rollbackTag”参数进行回滚。 即如果运行命令“mvn liquibase:rollbackSQL”,“rollbackTag”参数的值应该是多少。

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

【问题讨论】:

  • 你不是 Nathon voxland :-)

标签: database maven-plugin liquibase


【解决方案1】:

回滚标签旨在检查您的数据库配置。

以下命令会将数据库配置回滚 3 个变更集并创建一个名为“checkpoint”的标签:

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

修改示例

我最初发现很难弄清楚如何配置 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

【讨论】:

  • 在尝试创建 rollbackSQL 时,我收到错误:- [INFO] 设置或运行 Liquibase 时出错:liquibase.exception.RollbackImpossibleException:与 liquibase.change.core.UpdateDataChange 没有相反的创建
  • @gfghj 这真是一个新问题。您的问题是您有一个没有自动回滚选项的变更集。检查重构文档网页。 liquibase.org/manual/refactoring_commands。每个操作都将指示是否有自动回滚选项。通过在变更集中指定您自己的“回滚”部分来解决问题
  • 嗨,我在 maven 生命周期阶段尝试了使用 liquibase 标记的实现,并注意到 LB 在 DATABASECHANGELOG 表中为标记插入了一个单独的 db 行。这可以吗,还是我必须进一步配置 maven 执行才能使其正确?标签的db行:1480674890164,liquibase,liquibase-internal,2016-12-02 12:34:50,1,EXECUTED,7:d41d8cd98f00b204e9800998ecf8427e,Empty,,0.0.1-SNAPSHOT,3.2.2
  • 而且,在我执行回滚后,标签相关的行仍然保留在表中。
【解决方案2】:

我个人更喜欢将标签作为变更集文件的一部分,因此如果您必须回滚或删除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>

【讨论】:

  • 非常感谢。我创建了 maven 目标 rollbackSQL 并在配置中添加了标签 version_0.1.0。但是当我运行目标 rollbackSQL 时,它不会生成回滚脚本。但是,如果我使用 2 指定回滚计数,则会为最后两个变更集创建回滚脚本。知道为什么没有生成回滚脚本吗?
  • 您是否尝试直接从 liquibase 命令行启动 rollbackSQL 命令?只是为了确保你的数据库模式的当前状态和你的标签引用的状态是不同的,所以命令必须产生一些 SQL。
  • 没有。我使用 Maven 插件运行它。但是当运行 updateSQL 目标时,我可以看到在生成的 SQL 中添加了标签,并用它更新了数据库。我确信标签没有什么不同。
  • tagDatabase是否应该始终自包含在自己的changeSet标签​​中?
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2016-05-29
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2018-05-10
相关资源
最近更新 更多