2016-09-22 2 views
0

Liquibaseスクリプト()を使用して既存のデータベースをアップグレードすると、データベースがLiquibaseによってアップグレードされたことはありません。foreignKeyConstraintExists同じ参照の詳細は異なる名前の外部キーが存在する場合、前提条件が正しくないと思われる

liquibase.exception.MigrationFailedException: Migration failed for change set ../master.xml::5::ray.chen: 
    Reason: liquibase.exception.DatabaseException: ORA-02275: such a referential constraint already exists in the table 
[Failed SQL: ALTER TABLE CRDM_RCHEN.SOME_TABLE ADD CONSTRAINT SOME_TABLE_FK FOREIGN KEY (COLUMN_2) REFERENCES CRDM_RCHEN.SOME_OTHER_TABLE (COLUMN_1)] 

     at liquibase.changelog.ChangeSet.execute(ChangeSet.java:605) 
     at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:51) 
     at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:79) 
     at liquibase.Liquibase.update(Liquibase.java:214) 
     at liquibase.Liquibase.update(Liquibase.java:192) 
     at liquibase.integration.commandline.Main.doMigration(Main.java:1126) 
     at liquibase.integration.commandline.Main.run(Main.java:184) 
     at liquibase.integration.commandline.Main.main(Main.java:103) 

私はすでにSOME_TABLE_1_FKという名前の外部キーがデータベースに存在する、LiquiBaseをスクリプトとデータベースをダブルチェック。根本的な原因は、LiquibaseスクリプトがSOME_TABLE_FKという名前の外部キーを追加しようとしているが、という名前の外部キーSOME_TABLE_1_FKが、同じ参照の詳細と異なる名前で既に存在していることです。それはデータベースが異なる2つの外部キーを許可していないようだが、参照の詳細は同じです。

この問題に関する解決策やアイデアはありますか?ありがとう。

これは、関連するLiquibaseスクリプトです。 foreignKeyConstraintExists前提条件を使用して、外部キーSOME_TABLE_FKが存在するかどうかを確認し、そうでない場合は追加します。参照の内容は同じであるが名前が異なる外部キーがある場合(上記の場合)チェンジセットが実行され、上記のエラーが発生します。 LiquiBaseをによって提供

<changeSet author="ray.chen" id="5"> 
    <preConditions onFail="MARK_RAN"> 
     <not> 
      <foreignKeyConstraintExists foreignKeyName="SOME_TABLE_FK" /> 
     </not> 
    </preConditions> 
    <addForeignKeyConstraint constraintName="SOME_TABLE_FK" baseTableName="SOME_TABLE" baseColumnNames="COLUMN_2" referencedTableName="SOME_OTHER_TABLE" referencedColumnNames="COLUMN_1" deferrable="false" initiallyDeferred="false" onDelete="RESTRICT" onUpdate="RESTRICT" /> 
</changeSet> 

答えて

1

foreignKeyConstraintExists渡されるforeignKeyNameを必要とします。名前のない外部キーがあるかどうかを確認するために、カスタム前提条件を記述する必要があります。同様の例は、以下に見ることができる。テーブルの列が外部テーブルの外部キー制約がある場合、上記でチェックし

<preConditions onFail="MARK_RAN"> 
    <not> 
     <customPrecondition className="com.ctp.liquibase.ForeignKeyExistsPrecondition"> 
      <param name="schemaName" value="MYSCHEMA"/> 
      <param name="tableName" value="TABLE"/> 
      <param name="columnName" value="COLUMN"/> 
      <param name="foreignTableName" value="FTABLE"/> 
     </customPrecondition> 
    </not> 
</preConditions> 

さらにhereが見つかります。

+0

ありがとうDeendayal Garg。私はあなたの答えを見て記事を提供するまで、カスタム前提条件を書く方法を知らなかった。ありがとう。 –

+0

それは動作していません – Marcel

関連する問題