gpt4 book ai didi

java - 没有创建 liquibase.change.core.RawSQLChange 的逆

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:43 30 4
gpt4 key购买 nike

问题在于:执行命令maven时,似乎问题在https://liquibase.jira.com/browse/CORE-465中找到,但是是 2009 年,可以标记为“无法重现”,我使用一个文件 .xml 类型的 liquibase 和一个 changeSet,但是很多 createTable,addPrimaryKey,rollback,addForeignKeyConstraint,这个文件总是创建表和你各自的约束,但我我要回滚这个错误发生了,我累了上网找,然后找不到解决问题的办法,你能解决这个问题吗?与社区分享!

此处用于 Maven 的插件和命令:

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>

这产生了下面的堆栈跟踪

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.4.1:rollback (default-cli) on project generic: Error setting up or running Liquibase: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.RawSQLChange created -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.liquibase:liquibase-maven-plugin:3.4.1:rollback (default-cli) on project generic: Error setting up or running 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) at org.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) Caused by: org.apache.maven.plugin.MojoExecutionException: Error setting up or running 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 more Caused by: 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.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 more Caused by: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.RawSQLChange created at liquibase.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 more [ERROR] [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

最佳答案

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

此处的文档 http://www.liquibase.org/documentation/changes/sql.html用于 SQL 标记。一般回滚在此处描述:http://www.liquibase.org/documentation/rollback.html

特别注意这一段:

Other refactorings such as “drop table” and “insert data” have no corresponding rollback commands that can be automatically generated. In these cases, and cases where you want to override the default generated rollback commands, you can specify the rollback commands via the tag within the changeSet tag. If you do not want anything done to undo a change in rollback mode, use an empty tag.

这是一个显示原始 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>

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

关于java - 没有创建 liquibase.change.core.RawSQLChange 的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32166653/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com