5

Nigdy wcześniej nie stosowałem Liquibase i po prostu nie mogę wymyślić, jak rozwiązać ten problem. Projekt, do którego ostatnio dołączyłem, to remake starego projektu, więc musimy trzymać się starej bazy danych, która ma okropnie zaprojektowany schemat. Baza danych nie używa żadnych ograniczeń klucza obcego, więc nadal istnieją wpisy wskazujące pozycję, która już nie istnieje. W moim przypadku jest to lekarz posiadający rachunek bankowy w banku, który nie istnieje w bazie danych. Sposób, w jaki mój zespół radził sobie z tymi problemami do tej pory, przesłaniał identyfikator NULL. Więc zasadniczo próbuję ustawić wszystkie identyfikatory konta bankowego na NULL, kiedy bank nie istnieje. Kod SQL zrobiłem do wykonania tego zadania jest następująca:Aktualizowanie wierszy w Liquibase ze złożonym poleceniem WHERE

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

powiedziano mi, że integracja naprawić w naszych Zestawienia zmian Liquibase, ale po prostu nie może dowiedzieć się, jak to zrobić. To, co zrobiłem do tej pory:

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

Aktualizacja Liquibase przebiega bez błędów, ale kiedy patrzę na bazie potem nic się nie zmieniło. Czy ktoś ma jakieś wskazówki dla mnie, jak rozwiązać ten problem?

+0

No i przy okazji, jesteśmy z wykorzystaniem bazy danych Oracle 10g, czy to pomaga. – David

Odpowiedz

7

W końcu zorientowałem się, na czym polega problem. Z samym zestawem zmian właściwie nie było problemu. Kiedy Liquibase aktualizuje bazę danych, rejestruje wszystkie zestawy zmian w bazie danych, tak że zestawy zmian, które zostały już wykonane, nie zostaną ponownie uruchomione. Liquibase zapisuje hash zawartości zestawu zmian, tak że zmienione zmienniki zostaną ponownie wykonane. Problem polegał na tym, że baza danych była czysta po pierwszym uruchomieniu zestawu zmian, ponieważ zrobiłem to ręcznie, używając następującej komendy SQL: UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);. Następnie zmieniłem wiersz z lekarzem i ustawiłem identyfikator banku na bank, który nie istnieje, i ponownie wykonałem zestaw zmian, aby sprawdzić, czy zestaw zmian rzeczywiście działa. Ponieważ Liquibase miał mój zestaw zmian w swoim dzienniku, nie został ponownie wykonany. Dlatego nie mogłem zobaczyć zmiany w bazie danych. Zauważyłem, że po wycofaniu wszystkich zmian i aktualizacji bazy danych ponownie.

Aby zestaw zmian był kompletny, musiałem również zdefiniować wycofanie, ponieważ Liquibase nie może automatycznie przywracać aktualizacji wiersza. Ponieważ numery ID rachunkach bankowych są utracone na zawsze, po prostu dodaje pusty cofnąć polecenie:

<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> 
Powiązane problemy