No inverse to liquibase.change.core.RawSQLChange created

2022-09-04 07:59:18

问题在于:当播放命令maven时,似乎在 https://liquibase.jira.com/browse/CORE-465 中发现的问题,但是2009年,可以标有“无法复制”,我使用一个文件.xml类型liquibase与一个changeSet,但许多创建Table,addPrimaryKey,rollback,addForeignKeyConstraint,此文件创建总是表和您各自的约束,但我进行回滚,这是错误的发生, 我累了找互联网,那么找不到解决问题的方法,你能解决这个问题吗?与社区分享!

插件和命令用于此专家:

liquibase:rollback -Dliquibase.rollbackTag=payScript -PproductionPostgreSql

插件在这里

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.4.1</version>
    <configuration>
        <changeLogFile>${basedir}/src/main/resources/changelogs/db.changelog-master.xml</changeLogFile>
        <driver>${driver}</driver>
        <url> ${host.db}</url>
        <username>${user.db}</username>
        <password>${password.db}</password>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>3.4.1</version>
        </dependency>
    </dependencies>
</plugin>

这产生了下面的堆栈跟踪

[错误]未能在项目泛型上执行目标 org.liquibase:liquibase-maven-plugin:3.4.1:rollback (default-cli) on project generic: 错误设置或运行 Liquibase: liquibase.exception.RollbackImpossibleException: No 逆向 liquibase.change.core.RawSQLChange created -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: 未能执行 goal org.liquibase:liquibase-maven-plugin:3.4.1:在项目泛型上回滚 (default-cli) 时出错: 设置或运行 Liquibase 时出错:liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.RawSQLChange created at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193) atorg.apache.maven.DefaultMaven.execute(DefaultMaven.java:106) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286) at org.apache.maven.cli.MavenCli.main(MavenCli.java:197) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.delegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.codehaus.plexus.classworlds.launcher.launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.launcher.main(Launcher.java:356) 由引起:org.apache.maven.plugin.MojoExecutionException: 错误设置或运行 Liquibase: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.RawSQLChange created at org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute(AbstractLiquibaseMojo.java:398) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) ...20 更多 Cause: liquibase.exception.RollbackFailedException: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.RawSQLChange created at liquibase.changelog.ChangeSet.rollback(ChangeSet.java:648) at liquibase.changelog.visitor.RollbackVisitor.visit(RollbackVisitor.java:39) at liquibase.changelog.ChangeLog.ChangeLogIterator.run(ChangeLogIterator.java:73) at liquibase.Liquibase.rollback(Liquibase.java:656) at org.liquibase.maven.plugins.LiquibaseRollback.performLiquibaseTask(LiquibaseRollback.java:121) at org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute(AbstractLiquibaseMojo.java:394) ...22 更多 Cause: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.RawSQLChange 在 liquib 创建ase.change.abstractChange.generateRollbackStatementsFromInverse(AbstractChange.java:424) at liquibase.change.AbstractChange.generateRollbackStatements(AbstractChange.java:397) at liquibase.database.AbstractJdbcDatabase.executeRollbackStatements(AbstractJdbcDatabase.java:1269) at liquibase.changelog.ChangeSet.rollback(ChangeSet.java:634) ...27 更多 [错误] [错误] [错误] 有关错误和可能的解决方案的更多信息,请阅读以下文章: [错误] [帮助 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException


答案 1

这是预期的行为。在更改日志的某个位置,您有一个使用原始 SQL 的变更集。你没有在这里包含它,但实际内容并不重要 - 只要它是原始SQL,Liquibase就无法确定如何“撤消”或回滚该更改。解决此问题的方法是查看该变更集,并向该变更集添加一个回滚标记,以描述如何回滚所做的更改。

此处 http://www.liquibase.org/documentation/changes/sql.html 的文档是针对 SQL 标记的。回滚一般如下所述:http://www.liquibase.org/documentation/rollback.html

特别要注意这一段:

其他重构(如“删除表”和“插入数据”)没有可以自动生成的相应回滚命令。在这些情况下,以及要重写默认生成的回滚命令的情况下,可以通过 changeSet 标记中的标记指定回滚命令。如果不希望执行任何操作来撤消回滚模式下的更改,请使用空标记。

下面是一个示例,其中显示了原始 SQL 变更集和相应的回滚标记。

<changeSet author="liquibase-docs" id="sql-example">
    <sql dbms="h2, oracle"
            endDelimiter="\nGO"
            splitStatements="true"
            stripComments="true">insert into person (name) values ('Bob')
        <comment>What about Bob?</comment>
    </sql>
    <rollback>
        delete from person where name='Bob';
    </rollback>
</changeSet>

请注意,这是一个非常幼稚的示例 - 您可能不希望在实际场景中使用它,因为在运行以部署此更改后,任何使用数据库的程序都可能将行插入到名为“Bob”的 person 表中,并且此回滚语句将删除名称为“Bob”的所有行。liquibase update


答案 2

推荐