5

Ich habe noch nie zuvor mit Liquibase gearbeitet und kann einfach nicht herausfinden, wie ich dieses Problem lösen kann. Das Projekt, dem ich kürzlich beigetreten bin, ist ein Remake eines alten Projekts, also müssen wir bei einer alten Datenbank bleiben, die ein entsetzlich gestaltetes Schema hat. Die Datenbank verwendet keine Fremdschlüsseleinschränkungen, daher gibt es noch Einträge, die auf einen Eintrag zeigen, der nicht mehr existiert. In meinem Fall ist es ein Arzt, der ein Bankkonto bei einer Bank hat, das nicht in der Datenbank existiert. Die Art und Weise, wie mein Team diese Probleme bisher behandelt hat, überschreibt die ID mit NULL. Also versuche ich im Grunde, alle Bankkonto-IDs auf NULL zu setzen, wenn die Bank nicht existiert. Der SQL-Code habe ich diese Aufgabe zu erreichen, ist wie folgt:Aktualisieren von Zeilen in Liquibase mit einer komplexen WHERE-Anweisung

UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK); 

Mir wurde gesagt, zu, dass in unsere Liquibase Changesets beheben zu integrieren, aber ich kann einfach nicht herausfinden, wie es zu tun. Dies ist, was ich bisher getan haben:

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

Das Update Liquibase ohne Fehler ausgeführt wird, aber wenn ich in der Datenbank suchen danach, hat sich nichts geändert. Hat jemand irgendwelche Hinweise für mich, wie man dieses Problem löst?

+0

Oh, und übrigens, verwenden wir eine Oracle 10g Datenbank, ob das hilft. – David

Antwort

7

Ich endlich herausgefunden, was das Problem war. Es gab eigentlich kein Problem mit dem Changeset selbst. Wenn Liquibase die Datenbank aktualisiert, protokolliert es alle Changesets in der Datenbank, sodass die Changesets, die bereits ausgeführt wurden, nicht erneut ausgeführt werden. Liquibase speichert einen Hash des Inhalts des Changesets, so dass Changesets, die geändert wurden, erneut ausgeführt werden. Das eigentliche Problem war, dass die Datenbank sauber war, als ich das Changeset zum ersten Mal ausführte, weil ich es manuell mit dem folgenden SQL-Befehl ausgeführt habe: UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);. Danach habe ich eine Arzt-Zeile geändert und die Bank-ID auf eine Bank gesetzt, die nicht existiert und den Changeset erneut ausgeführt, nur um zu testen, ob der Changeset tatsächlich funktioniert. Da Liquibase mein Änderungsset in seinem Protokoll hatte, wurde es nicht erneut ausgeführt. Daher konnte ich die Änderung in der Datenbank nicht sehen. Das ist mir aufgefallen, als ich alle Änderungen rückgängig gemacht und die Datenbank erneut aktualisiert habe.

Um das Changeset abzuschließen, musste ich auch ein Rollback definieren, da Liquibase die Zeilenaktualisierungen nicht automatisch zurücksetzen kann. Da die IDs der Bankkonten für immer verloren gehen, habe ich nur noch einen leeren Rollback-Befehl:

<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> 
     <rollback> 
     </rollback> 
    </changeSet> 
</databaseChangeLog> 
Verwandte Themen