Ответ 1
Если вы уверены, что ваши сценарии правильно отражают то, что должно быть в базе данных, запустите Liquibase: clearCheckSums maven goal, который очистит все.
Maven запускает проверку липибазы, даже никаких изменений в наборе изменений не было.
Моя база данных - оракул.
Ситуация:
В таблице изменений в DB была запись для набора изменений <changeSet id="1" author="me" dbms="oracle">
;
Затем по ошибке я добавил еще один набор изменений <changeSet id="1" author="me" dbms="hsqldb">
Повторные сценарии ликбазы. Ошибка проверки контрольной суммы Maven.
Затем я изменил hsqldb changeSet на <changeSet id="2" author="me" dbms="hsqldb">
Maven все еще исправляет ошибку проверки контрольной суммы.
Затем я изменил первую контрольную сумму changeSet в БД вручную на текущий checkSum и успешно запустил сценарии.
Все выглядит красиво, но когда я перераспределяю все приложение и запускаю скрипты linibase, контрольная сумма первого changeSet по-прежнему нравится до 6 шагов.
Если вы уверены, что ваши сценарии правильно отражают то, что должно быть в базе данных, запустите Liquibase: clearCheckSums maven goal, который очистит все.
Ликвибаза выдает ошибки проверки контрольной суммы, чтобы указать, что изменения, примененные к базе данных, больше не соответствуют содержимому, указанному в файлах ревизий Ликвибасы....
Это мера безопасности, предназначенная для обнаружения файлов спецификаций с неправильным поведением, которая может легко возникнуть во время разработки. Лучший способ решить эту проблему - отбросить все объекты и запустить жидкость в новой среде разработки следующим образом:
mvn liquibase:dropAll liquibase:update
Предупреждение - это удалит все объекты в схеме. Вы потеряете все данные в таблицах и любой объект, не управляемый Liquibase. Документация для достижения цели
Иногда вы действительно хотите поддержать изменение наборов изменений. В этих обстоятельствах liquibase поддерживает атрибут runOnChange, который выборочно применяет наборы изменений к экземпляру базы данных.
В моем случае я забыл, что Liquibase записывает все chagelogs в таблицу базы данных.
Перейдите в таблицу DATABASECHANGELOG и удалите вручную свои чагетоны.
Поскольку я борюсь с этим, я хочу облегчить людям эту проблему:
<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>
Все здесь говорят о том, как это исправить, но позвольте мне рассказать о типичном сценарии, где это может произойти для вас.
КРАТКИЙ ОТВЕТ: Изменение разделителя строк по той или иной причине может вызвать ошибку проверки контрольной суммы и не будет отображаться при изменениях кода.
Почему это произошло для меня? Пожалуйста, прочитайте ниже..
Предположим, у вас есть сервер Tomcat, и время от времени в развертывании WAR участвуют несколько человек. Все используют INTELLIJ IDEA в Linux, но один из членов команды почему-то переключается на WINDOWS. Теперь, когда ЧЕЛОВЕК WINDOWS создаст WAR, он может не заметить, что выбор разделителя строк по умолчанию в INTELLIJ IDEA для WINDOWS - это CRLF, но все предыдущие сборки, построенные на машине LINUX, которая использует LF-разделитель строк.
Изменение в разделителе строк влияет на все текстовые файлы, включая файлы SQL. Таким образом, вы, возможно, использовали следование, как моя команда, в вашем скрипте liquibase
changeSet(author: "aditya", id: "1335831637231-1") {
sqlFile( path: "liquibase/quartz_oracle_tables.sql", "stripComments": true)
}
и контрольная сумма файла не будет совпадать с уже сохраненной в базе данных ошибкой проверки контрольной суммы.
Liquibase читает таблицу databasechangelog
, чтобы проверить последние изменения.
Итак, определите идентификатор databasechnagelog
, который вызывает проблему, и удалите, как показано ниже:
select * from myschema.DATABASECHANGELOG;
Delete from myschema.DATABASECHANGELOG where ID='prob_id';