7

これまで Liquibase を使用したことがなく、この問題を解決する方法がわかりません。私が最近参加したプロジェクトは古いプロジェクトのリメイクであるため、古いデータベースに固執する必要があり、そのスキーマはひどく設計されています。データベースは外部キー制約を使用しないため、存在しないエントリを指すエントリがまだ存在します。私の場合、データベースに存在しない銀行に銀行口座を持つ医師です。私のチームがこれまでにこれらの問題に対処した方法は、ID を NULL で上書きすることでした。したがって、基本的に私がやろうとしているのは、銀行が存在しない場合に、すべての銀行口座 ID を NULL に設定することです。このタスクを実行するために作成した SQL コードは次のとおりです。

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

その修正を Liquibase チェンジセットに統合するように言われましたが、その方法がわかりません。これは私がこれまでに行ったことです:

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

Liquibase の更新はエラーなしで実行されますが、後でデータベースを見てみると、何も変わっていません。この問題を解決する方法を教えてくれる人はいますか?

4

1 に答える 1

9

私はついに問題が何であるかを理解しました。チェンジセット自体には実際には問題はありませんでした。Liquibaseがデータベースを更新すると、データベース内のすべてのチェンジセットがログに記録されるため、すでに実行されているチェンジセットは再度実行されません。Liquibaseは、変更セットのコンテンツのハッシュを保存するため、変更された変更セットが再度実行されます。実際の問題は、次のSQLコマンドを使用して手動で実行したため、最初にチェンジセットを実行したときにデータベースがクリーンであったことでした。UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);。その後、ドクター行を変更し、バンクIDを存在しないバンクに設定して、チェンジセットが実際に機能するかどうかをテストするために、チェンジセットを再度実行しました。Liquibaseのログにチェンジセットが含まれていたため、再度実行されることはありませんでした。したがって、データベースの変更を確認できませんでした。すべての変更をロールバックしてデータベースを再度更新したときに気づきました。

Liquibaseは行の更新を自動的にロールバックできないため、変更セットを完了するには、ロールバックも定義する必要がありました。銀行口座のIDは永久に失われるため、空のロールバックコマンドを追加しました。

<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>
于 2013-03-14T16:18:37.513 に答える