5

これまでLiquibaseを使用したことはなく、この問題の解決方法を理解することはできません。私が最近参加したプロジェクトは、古いプロジェクトのリメイクですので、ひどく設計されたスキーマを持つ古いデータベースを守らなければなりません。データベースは外部キー制約を使用しないため、もはや存在しないエントリを指すエントリが存在します。私の場合は、データベースに存在しない銀行口座を持つ医者です。私のチームがこれまでにこれらの問題を処理した方法は、NULLでIDを上書きしていました。だから私がやろうとしているのは、銀行が存在しないときにすべての銀行口座IDをNULLに設定することです。次のように私は、このタスクを達成するために作られたSQLコードは次のとおりです。複雑なWHEREステートメントでLiquibaseの行を更新する

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を更新がエラーなしで実行されますが、私はその後データベースを見ると、何も変わっていない:これは私がこれまで行っているものです。誰も私のためにどのようにこの問題を解決するためのポインターを持っていますか?

+0

ああ、それが助け場合によって、我々は、Oracle 10gデータベースを使用しています。 – David

答えて

7

私はついにこの問題が何かを理解しました。実際にチェンジセット自体に問題はありませんでした。 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> 
関連する問題