Ошибка проверки контрольной суммы Liquibase без каких-либо изменений


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

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

Ситуация:

  1. В БД changelog таблица была записью для набора изменений <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. Мэйвен все еще стреляет контрольной суммой ошибка проверки.

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

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

5 25

5 ответов:

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

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

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

mvn liquibase:dropAll liquibase:update

Документация для drop-all goal

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

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

На DATABASECHANGELOG таблица и удалить вручную chagelogs.

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

  1. важно!, При есть при Есть 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 замените на правильный IP-адрес и порт.

Наконец вы бежите mvn liquibase:clearCheckSums

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

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

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

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

Предположим, у вас есть сервер tomcat, и несколько человек время от времени участвуют в развертывании военных действий. Все используют INTELLIJ IDEA на LINUX, но один из членов команды по какой-то причине переключается на WINDOWS. Теперь, когда человек WINDOWS создаст WAR, он может не заметить, что выбор разделителя строк по умолчанию в INTELLIJ IDEA для WINDOWS-CRLF, но все предыдущие сборки, построенные на машине LINUX, которая использует разделитель строк LF.

Изменение разделителя строк влияет на все текстовые файлы,включая файлы SQL. Таким образом, вы, возможно, использовали following так же, как моя команда в вашем скрипте liquibase

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

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