问题在于:当播放命令maven时,似乎问题在https://liquibase.jira.com/browse/CORE-465中找到,但就是那个2009,可以用"Cannot Reproduce"标记,我'm use one file .xml type liquibase with one changeSet, but many createTable, addPrimaryKey, rollback, addForeignKeyConstraint, this file create always tables and your respective constraints, but i'米做了回滚这个错误发生了,我找到了解决问题的方法,你能不能解决了这个问题?与社区分享!
插件和命令用于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>
这产生了下面的堆栈跟踪
[错误]无法执行目标org.liquibase:liquibase-maven-plugin:3.4.1:rollback(default-cli)on project generic:设置或运行Liquibase时出错:liquibase.exception.RollbackImpossibleException:与liquibase无反转 . change.core.RawSQLChange created - > [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException:无法执行目标org.liquibase:liquibase-maven-plugin:3.4.1:rollback(default-cli)on project generic:设置或运行Liquibase时出错:liquibase.exception.RollbackImpossibleException:与在org.apache的org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)中创建的liquibase.change.core.RawSQLChange无反向 . maven.lifecycle.internal.MojoExecutor.execute在org.apache.maven.lifecycle.internal.LifecycleModuleBuilder(MojoExecutor.java:153)在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) . org.apache.maven.lifecycle.internal.LifecycleModuleBui中的buildProject(LifecycleModuleBuilder.java:116) lder.buildProject(LifecycleModuleBuilder.java:80)在org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)在org.apache.maven.lifecycle.internal.LifecycleStarter.execute( LifecycleStarter.java:128)org.apache.maven.maven.DefaultMaven.doExecute(DefaultMaven.java:307)org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)atg.apache.maven.DefaultMaven.execute (DefaultMaven.java:106)org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)位于org.apache的org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286) . maven.cli.MavenCli.main(MavenCli.java:197)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43)atg.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java)中的java.lang.reflect.Method.invoke(Method.java:497) :289)org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)org.codehaus的org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) . plexus.classworlds.launcher.Launcher.main(Launcher.java:356)引起:org.apache.maven.plugin.MojoExecutionException:设置或运行Liquibase时出错:liquibase.exception.RollbackImpossibleException:与liquibase.change.core无反转.RawSQLChange在org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute(AbstractLiquibaseMojo.java:398)在org.apache.maven.lifecycle创建在org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) . internal.MojoExecutor.execute(MojoExecutor.java:208)... 20更多引起:liquibase.exception.RollbackFailedException:liquibase.exception.RollbackImpossibleException:与liquibase.changelog.ChangeSet中创建的liquibase.change.core.RawSQLChange无反向 . 在liquibase.changelog.visitor.R上回滚(ChangeSet.java:648) ollbackVisitor.visit(RollbackVisitor.java:39)在liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73)在liquibase.Liquibase.rollback(Liquibase.java:656)在org.liquibase.maven.plugins.LiquibaseRollback.performLiquibaseTask liquibase.exception.RollbackImpossibleException::(LiquibaseRollback.java:121)在org.liquibase.maven.plugins.AbstractLiquibaseMojo.execute(AbstractLiquibaseMojo.java:394)...... 22多由没有造成逆liquibase.change.core.RawSQLChange在Liquibase.change日志中的liquibase.change.AbstractChange.generateRollbackStatements(AbstractChange.java:397)的liquibase.change.AbstractChange.generateRollbackStatementsFromInverse(AbstractChange.java:424)中创建liquibase.AbstractJdbcDatabase.executeRollbackStatements(AbstractJdbcDatabase.java:1269) .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
特别要注意这一段:
下面是一个示例,显示原始SQL变更集和相应的回滚标记 .
请注意,这是一个天真的例子 - 您可能不希望在真实场景中使用它,因为在运行
liquibase update
来部署此更改之后,使用数据库的任何程序都可能会将行插入到人员表中名称为'Bob',此回滚语句将删除名称为'Bob'的所有行 .