Dag*_*eto 40 changeset liquibase maven
即使在变更集中没有进行任何更改,Maven也会触发liquibase验证失败.
我的数据库是oracle.
情况:
在DB changelog表中记录了变更集<changeSet id="1" author="me" dbms="oracle">;
然后我错误地添加了另一个变更集 <changeSet id="1" author="me" dbms="hsqldb">
重新运行的liquibase脚本Maven解除了校验和验证错误.
然后我将hsqldb changeSet更改为 <changeSet id="2" author="me" dbms="hsqldb">
Maven仍然触发校验和验证错误.
然后我手动将DB中的第一个changeSet校验和更改为当前checkSum并成功运行脚本.
一切看起来都不错,但是当我重新部署整个应用程序并运行liquibase脚本时,第一个changeSet的校验和仍然像之前的6步一样.
Roy*_*ove 65
如果您确信您的脚本正确反映了数据库中应包含的内容,请运行liquibase:clearCheckSums maven目标,这将清除它们.
Mar*_*nor 21
liquibase抛出校验和验证错误,表明应用于数据库的更改不再与liquibase变更集文件中指定的相同内容相匹配....
这是一种安全措施,旨在检测错误的规范文件,并且在开发过程中很容易发生.解决问题的最佳方法是删除所有对象并对开发环境运行liquibase,如下所示:
mvn liquibase:dropAll liquibase:update
Run Code Online (Sandbox Code Playgroud)
警告 - 这将删除架构中的所有对象.您将丢失表中的所有数据,以及任何不受Liquibase管理的对象.全面目标的文档
有时您实际上希望支持更改变更集.在这些情况下,liquibase支持"runOnChange"属性,该属性选择性地对数据库实例应用更改集.
Nan*_*dan 12
Liquibase 读取databasechangelog表格以验证最近的更改。所以找出databasechnagelog导致问题的id并删除,如下图:
select * from myschema.DATABASECHANGELOG;
Delete from myschema.DATABASECHANGELOG where ID='prob_id';
Run Code Online (Sandbox Code Playgroud)
这里的每个人都在谈论如何解决这个问题,但让我分享一个可能发生在您身上的典型场景。
简短回答:由于某种原因更改行分隔符可能导致校验和验证错误,并且在代码更改中不可见。
为什么会发生在我身上?请阅读下面..
假设你有一个tomcat服务器,不时有多人参与WAR部署。每个人都在 LINUX 上使用 INTELLIJ IDEA,但其中一名团队成员出于某种原因切换到 WINDOWS。现在,当 WINDOWS PERSON 将创建 WAR 时,他可能不会注意到 INTELLIJ IDEA for WINDOWS 中的默认行分隔符选择是 CRLF,但所有以前的构建都是从使用 LF 行分隔符的 LINUX 机器构建的。
行分隔符的更改会影响所有文本文件,其中也包括 SQL 文件。所以你可能在你的 liquibase 脚本中像我的团队一样使用了以下内容
changeSet(author: "aditya", id: "1335831637231-1") {
sqlFile( path: "liquibase/quartz_oracle_tables.sql", "stripComments": true)
}
Run Code Online (Sandbox Code Playgroud)
并且文件的校验和与数据库中已存储的校验和不匹配,引发校验和验证错误。
当我在解决这个问题时,我想让有同样问题的人变得更容易:
<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>Run Code Online (Sandbox Code Playgroud)
**** 版本是我在 url 中使用的 3.2.0 替换为正确的 IPADDRESS 和 PORT。
最后你跑了mvn liquibase:clearCheckSums
希望能帮助到你!
小智 5
liquibase 文档现在有第二个选项
The <validCheckSum> attribute
The second option is to add a <validCheckSum> element to the changeset. The text contents of the element should contain the old checksum from the error message.
Run Code Online (Sandbox Code Playgroud)
假设您很少需要更改历史变更日志 XML 文件,那么您很少会收到错误消息。如果您收到错误消息,请添加一个带有旧校验和的标签,确认没有问题。
例子:
<changeSet id="example" author="former-author" runOnChange="false">
<validCheckSum>8:869....4e3</validCheckSum>
<addColumn tableName="ye_olde_db_table">
<!-- fix some old typo or incompatibility, etc -->
</addColumn>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66429 次 |
| 最近记录: |