Ошибка проверки контрольной суммы Liquibase без каких-либо изменений - PullRequest
37 голосов
/ 03 апреля 2012

Maven запускает проверку достоверности ликвидазы, даже если в набор изменений не было внесено никаких изменений.

Моя база данных - oracle.

Ситуация:

  1. В журнале изменений БДтаблица была записана для набора изменений <changeSet id="1" author="me" dbms="oracle">;

  2. Затем по ошибке я добавил другой набор изменений <changeSet id="1" author="me" dbms="hsqldb">

  3. Снова запущенные сценарии ликвидазы База проверки контрольной суммы по Mavenошибка.

  4. Затем я изменил hsqldb changeSet на <changeSet id="2" author="me" dbms="hsqldb">

  5. Ошибка проверки контрольной суммы Maven все еще запускается.

  6. Затем я вручную изменил первую контрольную сумму changeSet в БД на текущую контрольную сумму, и сценарии успешно запустились.

Все выглядит хорошо, но когда я заново развертываю все приложение и запускаю контрольную сумму сценариев liquibase первойchangeSet по-прежнему, как до 6 шага.

Ответы [ 5 ]

60 голосов
/ 03 апреля 2012

Если вы уверены, что ваши скрипты правильно отражают то, что должно быть в базе данных, запустите liquibase: clearCheckSums maven цель, которая очистит ее все вверх.

19 голосов
/ 03 апреля 2012

Ошибки проверки контрольной суммы генерируются liquibase, чтобы указать, что изменения, примененные к базе данных, больше не соответствуют содержимому, указанному в файлах набора изменений liquibase ....

Это мера безопасности, предназначенная для обнаружения ошибок- ведение файлов спецификаций и может легко произойти во время разработки.Лучший способ решить эту проблему - отбросить все объекты и запустить жидкость в новой среде разработки следующим образом:

mvn liquibase:dropAll liquibase:update

Предупреждение - это приведет к удалению всех объектов в схеме. Вы потеряете все данные в таблицах и любой объект, не управляемый Liquibase.Документация для drop-all target

Иногда вы действительно хотите поддержать изменение наборов изменений.В этих обстоятельствах liquibase поддерживает атрибут "runOnChange" , который выборочно применяет наборы изменений к экземпляру базы данных.

6 голосов
/ 28 декабря 2017

В моем случае я забыл, что Liquibase записывает все чагелоги в таблицу базы данных.

Перейдите на таблицу DATABASECHANGELOG и удалите вручную свои чагелоги.

3 голосов
/ 20 июля 2018

Все здесь говорят о том, как это исправить, но позвольте мне рассказать о типичном сценарии, где это может произойти для вас.

КОРОТКИЙ ОТВЕТ: изменение разделителя строк по той или иной причине может вызвать ошибку проверки контрольной суммы и не будет отображаться в коде изменения.

Почему это произошло со мной? Пожалуйста, прочитайте ниже ..

Предположим, у вас есть сервер 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)
}

и контрольная сумма файла не будет совпадать с уже сохраненной в базе данных ошибкой проверки контрольной суммы.

3 голосов
/ 04 апреля 2016

Поскольку я борюсь с этим, я хочу облегчить людям с этой же проблемой:

  1. Важно! У liquibase есть liquibase, есть файл changlog.xml
  2. В файле maven pom.xml поместите следующие свойства.

<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

Надеюсь, это поможет!

...