Обновление строк в Liquibase с помощью оператора complex WHERE

Я никогда не использовал при До и просто не могу понять, как решить эту проблему. Проект, к которому я недавно присоединился, является римейком старого проекта, поэтому мы должны придерживаться старой базы данных, которая имеет ужасно разработанную схему. База данных не использует ограничений внешнего ключа, поэтому все еще есть записи, указывающие на запись, которая больше не существует. В моем случае это врач, имеющий банковский счет в банке, который не существует в базе данных. Как моя команда справилась с этим проблемы до сих пор переопределяли ID с NULL. Поэтому в основном я пытаюсь установить все идентификаторы банковских счетов в NULL, когда банк не существует. SQL-код я сделал для выполнения этой задачи выглядит следующим образом:

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

мне сказали интегрировать это исправление в наши наборы изменений Liquibase, но я просто не могу понять, как это сделать. Вот что я сделал до сих пор:--3-->

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

обновление при выполняется без ошибок, но когда я смотрю на базу данных после, ничего не изменилось. У кого-нибудь есть какие-либо указания для меня, как решить эту проблему?

1 ответов


Я, наконец, понял, в чем была проблема. С самим набором изменений проблем не было. Когда Liquibase обновляет базу данных, она регистрирует все наборы изменений в базе данных, чтобы уже выполненные наборы изменений не выполнялись снова. Liquibase сохраняет хэш содержимого набора изменений, так что измененные наборы изменений будут выполняться снова. Собственно проблема была в том, что база данных была чистой, когда я впервые выполнил набор изменений, потому что я сделал это вручную используя следующую команду SQL: UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);. После этого я изменил строку доктора и установил идентификатор банка в банк, который не существует, и снова выполнил набор изменений, чтобы проверить, действительно ли набор изменений работает. Поскольку Liquibase имел мой набор изменений в своем журнале, он не был выполнен снова. Поэтому я не видел изменений в базе данных. Я заметил,что когда я откатил все изменения и снова обновил базу данных.

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

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