Liquibase校验和验证错误,没有任何更改

时间:2012-04-03 14:48:46

标签: maven liquibase changeset

即使没有在变更集中进行任何更改,Maven也会激活liquibase验证失败。

我的数据库是oracle。

情况:

  1. 在DB更改日志表中记录了变更集<changeSet id="1" author="me" dbms="oracle">;

  2. 然后我错误地添加了另一个变更集<changeSet id="1" author="me" dbms="hsqldb">

  3. 重新运行liquibase脚本Maven解决了校验和验证错误。

  4. 然后我将hsqldb changeSet更改为<changeSet id="2" author="me" dbms="hsqldb">

  5. Maven仍在触发校验和验证错误。

  6. 然后我手动将DB中的第一个changeSet校验和更改为当前checkSum并成功运行脚本。

  7. 一切看起来都不错,但是当我重新部署整个应用程序并运行liquibase脚本时,第一个changeSet的校验和仍然像之前的6步。

8 个答案:

答案 0 :(得分:58)

如果您确信您的脚本正确反映了应该在数据库中的内容,请运行liquibase:clearCheckSums maven目标,这将清除它们。

答案 1 :(得分:19)

liquibase抛出校验和验证错误,表明应用于数据库的更改不再与liquibase变更集文件中指定的相同内容相匹配....

这是一种安全措施,旨在检测错误的规范文件,并且在开发过程中很容易发生。解决问题的最佳方法是删除所有对象并对开发环境运行liquibase,如下所示:

mvn liquibase:dropAll liquibase:update

警告 - 这将删除架构中的所有对象。您将丢失表中的所有数据,以及任何不受Liquibase管理的对象。 drop-all goal

的文档

有时您确实希望支持更改变更集。在这些情况下,liquibase支持"runOnChange"属性,该属性选择性地将更改集应用于数据库实例。

答案 2 :(得分:6)

在我的情况下,我忘了 Liquibase 将所有chagelog写入数据库表。

转到 DATABASECHANGELOG 表并手动删除您的chagelog。

答案 3 :(得分:3)

这里的每个人都在谈论如何解决此问题,但让我分享一个可能会发生的典型情况。

  

最短答案:由于某种原因而导致的行分隔符更改可能导致校验和验证错误,并且在代码中不可见   更改。

为什么会发生在我身上?请阅读下面的内容。

假设您有一台tomcat服务器,并且不时有多个人参与WAR部署。每个人都在LINUX上使用INTELLIJ IDEA,但是其中一个团队成员出于某种原因而切换到WINDOWS。 现在,当WINDOWS PERSON创建WAR时,他可能不会注意到WINDOWS的INTELLIJ IDEA中默认的行分隔符选择是CRLF,但是以前的所有版本都是使用LF行分隔符从LINUX机器构建的。

换行符的更改会影响所有文本文件,其中也包括SQL文件。因此,您可能像在我的liquibase脚本中一样使用了我的团队

changeSet(author: "aditya", id: "1335831637231-1") {
    sqlFile( path: "liquibase/quartz_oracle_tables.sql", "stripComments": true)
}

并且文件的校验和与数据库中已经存储的校验和不匹配,抛出校验和验证错误。

答案 4 :(得分:2)

当我努力解决这个问题时,我想让那些有同样问题的人更容易:

  1. 重要!,liquibase有一个liquibase有一个changlog.xml文件
  2. 在maven pom.xml上放置以下属性。
  3. <project ...>
      <plugins>
        <plugin>
          <groupId>org.liquibase</groupId>
          <artifactId>liquibase-maven-plugin</artifactId>
          <version>*****</version>
          <configuration>
            <changeLogFile>src/main/resources/mychangelogfile.xml</changeLogFile>
            <driver>oracle.jdbc.driver.OracleDriver</driver>
            <url>jdbc:oracle:thin:@//X.X.X.X:PORT/XE</url>
            <username>yourusername</username>
            <password>password</password>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>clearCheckSums</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </project>

    ****版本我使用的3.2.0 在url中用适当的IPADDRESS和PORT替换。

    最后你运行mvn liquibase:clearCheckSums

    希望它有所帮助!

答案 5 :(得分:1)

Liquibase读取databasechangelog表以验证最近的更改。 因此,确定引起问题的databasechnagelog ID并删除,如下所示:

select * from myschema.DATABASECHANGELOG;

Delete from myschema.DATABASECHANGELOG where ID='prob_id';

Deleting a bad changelog in Liquibase

答案 6 :(得分:0)

在maven插件中配置liquibase的数据库链接信息。

像这样:

<plugin>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-maven-plugin</artifactId>
  <version>${liquibase.version}</version>
  <configuration>
    <changeLogFile>${project.basedir}/src/main/resources/config/liquibase/master.xml</changeLogFile>
    <driver>com.mysql.cj.jdbc.Driver</driver>
    <url>jdbc:mysql://localhost:3306/hos_gateway</url>
    <username>root</username>
    <password>root</password>
    <referenceUrl>hibernate:spring:com.hos.physician.domain?dialect=org.hibernate.dialect.MySQL5InnoDBDialect&amp;hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&amp;hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
    <verbose>true</verbose>
    <logging>debug</logging>
    <contexts>!test</contexts>
  </configuration>
</plugin>

答案 7 :(得分:0)

变更集ID不应重复。给出一个新的变更集ID并尝试,它应该可以工作。

Localizer["Register"].Value