web-dev-qa-db-fra.com

Erreur de validation de la somme de contrôle Liquibase sans aucune modification

Maven déclenche l'échec de la validation de la liquibase, même si aucune modification n'a été apportée dans changeset.

Ma base de données est Oracle.

Situation:

  1. Dans la base de données changelog, la table était un enregistrement pour changeset <changeSet id="1" author="me" dbms="Oracle">;

  2. Puis par erreur, j'ai ajouté un autre changeset <changeSet id="1" author="me" dbms="hsqldb">

  3. Scripts liquibase réexécutés Maven a déclenché une erreur de validation de la somme de contrôle.

  4. Puis j'ai changé hsqldb changeSet en <changeSet id="2" author="me" dbms="hsqldb">

  5. Maven déclenche toujours une erreur de validation de la somme de contrôle.

  6. Ensuite, j'ai modifié manuellement le total de contrôle de changeSet dans la base de données en checkSum actuel et les scripts ont été exécutés avec succès.

Tout a l'air sympa, mais quand je redéploie toute l'application et que j'exécute la somme de contrôle des scripts liquibase du premier changeSet, c'est toujours comme avant 6 étapes.

31
Daggeto

Si vous êtes sûr que vos scripts reflètent correctement ce que devrait figurer dans la base de données, exécutez le but liquibase: clearCheckSums maven, qui va tout nettoyer.

54
Roy Truelove

Des erreurs de validation de somme de contrôle sont émises par liquibase pour indiquer que les modifications appliquées à la base de données ne correspondent plus au même contenu spécifié dans les fichiers de jeu de modifications de liquibase .... 

Il s'agit d'une mesure de sécurité conçue pour détecter les fichiers de spécifications qui se comportent mal et qui peut facilement se produire pendant le développement. Le meilleur moyen de résoudre le problème consiste à supprimer tous les objets et à exécuter liquibase dans l'environnement de développement en procédant comme suit:

mvn liquibase:dropAll liquibase:update

Attention - cela jettera tous objets dans le schéma. Vous perdrez toutes les données des tables et tout objet non géré par Liquibase. Documentation pour objectif drop-all

Parfois, vous souhaitez réellement prendre en charge la modification des changesets. Dans ces circonstances, liquibase prend en charge un attribut "runOnChange" qui applique de manière sélective les ensembles de modifications à l'instance de la base de données. 

19
Mark O'Connor

Dans mon cas, j'ai oublié que Liquibase écrit tous les chagelogs dans la table de base de données.

Allez dansDATABASECHANGELOGtable et supprimez manuellement vos chagelogs.

3
Vova Perebykivskyi

En luttant avec celui-ci, je souhaite faciliter la tâche des personnes aux prises avec le même problème:

  1. Important !, liquibase a un liquibase a un fichier changlog.xml
  2. Sur le fichier pom.xml maven, placez les propriétés suivantes.

<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>

**** version que j'ai utilisé 3.2.0in url remplacer par IPADDRESS et PORT appropriés.

Enfin, vous exécutez mvn liquibase:clearCheckSums

J'espère que ça aide!

2
acabra85

Tout le monde ici parle de la façon de régler ce problème, mais laissez-moi vous raconter un scénario typique où cela pourrait se produire pour vous.

REPONSE COURTE: Une modification du séparateur de lignes due à une raison ou une autre peut entraîner une erreur de validation de la somme de contrôle et ne sera pas visible dans le code changements.

Pourquoi est-ce arrivé pour moi? S'il vous plaît lire ci-dessous..

Supposons que vous avez un serveur Tomcat et que plusieurs personnes sont impliquées dans le déploiement de WAR de temps à autre. Tout le monde utilise INTELLIJ IDEA sur LINUX, mais l'un des membres de l'équipe passe sous WINDOWS pour une raison quelconque. Maintenant, lorsque WINDOWS PERSON créerait WAR, il ne remarquera peut-être pas que la sélection de séparateur de ligne par défaut dans INTELLIJ IDEA pour WINDOWS est CRLF, mais que toutes les versions précédentes construites à partir de la machine LINUX utilisant la ligne LF -séparateur.

La modification du séparateur de lignes affecte tous les fichiers texte, y compris les fichiers SQL. Donc, vous avez peut-être utilisé la même chose que mon équipe dans votre script liquibase

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

et la somme de contrôle du fichier ne correspond pas à celle déjà stockée dans la base de données en générant une erreur de validation de la somme de contrôle.

1
Aditya Thakur