Mise à jour des lignes dans Liquibase avec un complexe OÙ la déclaration
Je n'ai jamais utilisé Liquibase avant et juste ne pouvez pas trouver comment résoudre ce problème. Le projet, j'ai récemment rejoint est un remake d'un vieux projet, nous avons donc coller avec une ancienne base de données, ce qui a un horriblement conçus schéma. La base de données n'utilise pas de contraintes de clés étrangères, donc il y a encore entrées qui pointent vers une entrée qui n'existe plus. Dans mon cas, c'est un médecin d'avoir un compte bancaire dans une banque qui n'existe pas dans la base de données. La façon dont mon équipe a géré ces problèmes jusqu'à présent a été remplaçant l'ID avec la valeur NULL. Donc, fondamentalement, ce que je suis en train de faire, c'est tout compte bancaire Id NULL, lorsque la banque est inexistante. Le code SQL que j'ai fait pour accomplir cette tâche comme suit:
UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);
M'a dit d'intégrer cette correction dans notre Liquibase révisions, mais je ne peux pas comprendre comment le faire. C'est ce que j'ai fait jusqu'à présent:
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
<changeSet id="remove_fk_bankid" author="v7">
<update tableName="DOCTOR">
<column name="FK_BANKID" value="NULL" />
<where>FK_BANKID NOT IN (SELECT ID FROM BANK)</where>
</update>
</changeSet>
</databaseChangeLog>
La Liquibase mise à jour s'exécute sans erreur, mais quand je regarde la base de données par la suite, rien n'a changé. Quelqu'un aurait-il une quelconque des pointeurs pour moi comment résoudre ce problème?
OriginalL'auteur David | 2013-03-11
Vous devez vous connecter pour publier un commentaire.
J'ai enfin compris quel était le problème. Il n'y a effectivement pas de problème avec la révision de lui-même. Lorsque Liquibase les mises à jour de la base de données qu'il enregistre toutes les modifications dans la base de données, de sorte que les ensembles de modifications qui ont déjà été exécutés de ne pas exécuter de nouveau. Liquibase enregistre une valeur de hachage de la révision du contenu, de sorte que les ensembles de modifications qui ont été modifiée sera de nouveau exécutée. Le problème réel est que la base de données était propre quand j'ai exécuté l'ensemble de modifications, car je l'ai fait manuellement à l'aide de la commande SQL suivante:
UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);
. Après que j'ai changé de médecin de ligne et de définir l'ID de la banque pour une banque qui n'existe pas et procédé à la révision de nouveau, juste pour tester si la révision fonctionne réellement. Depuis Liquibase eu mon ensemble de modifications dans son journal, il n'a pas été exécutée de nouveau. Par conséquent, je ne pouvais pas voir le changement dans la base de données. J'ai remarqué que quand j'ai roulé toutes les modifications et mise à jour de la base de données à nouveau.De faire la révision complète, j'ai également eu à définir un rollback, depuis Liquibase n'est pas en mesure de faire reculer la ligne automatiquement les mises à jour. Depuis les Identifiants de comptes bancaires sont perdus à jamais, j'ai juste ajouté un vide de rouleau de retour de la commande:
OriginalL'auteur David