0

私は最近、組織を去った開発者によって開発されていたブランチで作業を開始しましたが、関連するテスト環境スキーマを悪い状態で残したようです。

コードを実行するために必要な多くの変更を行う Liquibase 変更ファイルがありますが、関連するスキーマにはいくつかの変更が適用されているようです。

特に私の個人的な開発環境ではない場合は、手動でスキーマを更新しないようにしているので、既存の (かなり複雑な) 変更を機能させることを望んでいました。

私が得るエラーはこれです:

SEVERE 12/12/12 12:15 PM:liquibase: 変更セット db/changelogs/linechanges.xml::14::limit が失敗しました。エラー: SQL ALTER TABLE 制限 ADD id シリアルの実行エラー: エラー: リレーション "lineitem_limitgroup" の列 "id" は既に存在します liquibase.exception.DatabaseException: SQL ALTER TABLE 制限 ADD id シリアルの実行エラー: エラー: リレーションの列 "id" " limit" は、liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:62) の liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:104) に、liquibase.database.AbstractDatabase.execute(AbstractDatabase.java) に既に存在します。 :1075) で liquibase.database.AbstractDatabase.executeStatements(AbstractDatabase.java:1059) で liquibase.changelog.ChangeSet.execute(ChangeSet.java:317) で liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.

この変更ファイルには、複数の変更セットが含まれていることに注意してください。スキーマを調べると、いくつかの変更セットからの変更が適用されているように見えますが、他のいくつかには変更が適用されていません。

それで、失敗したチェンジセットを無視して続行するように(できればMavenプラグインを介して)liquibaseに指示する方法はありますか?

または(あまり役に立たない)liquibaseにいくつかの変更セットを適用し、他の変更セットを適用しないように指示する方法はありますか?

ありがとう!!!

4

3 に答える 3

0

Liquibase は変更セットを 2 回適用しません。しかし、おそらく、同じ (または互換性のない) 変更のいくつかが、他のブランチの異なる変更セットで行われた可能性があります。このブランチの変更セットを手動で編集して、それらがきれいに適用されるようにする以外に選択肢はないと思います。

于 2012-12-13T09:55:25.413 に答える
0

最良の選択肢は、Liquibase の前提条件を使用して、列が存在しない場合にのみ chanset をエラーで実行するように指示することです。次のように、タグ columnExists を使用する必要があります。

<preConditions>
  <not>
    <columnExists columnName="id" tableName="limit" schemaName="yourSchemaNameHere" />
  </not>
</preConditions>

制限テーブルに id 列が既にある場合は、実際に更新を実行せずにスクリプトを実行済みとしてマークします。

他にも 2 つのオプションがあります。

最初のオプション。エラーをトリガーする変更セットで属性 failOnError を false に設定できます。エラーが発生しやすい変更セットは、エラーが発生するポイントまで実行されます。次の変更セットは正常に実行されます。

エラー時に変更セットをロールバックせず、変更セットを実行済みとしてマークしないため、これは注意して使用してください。また、この属性が false に設定された変更セットを既に持っている場合は、部分的な更新を行う理由が説明される可能性があることに注意してください。

2 番目のオプションは、テーブル DATABASECHANGELOG に行を挿入して、特定の変更セットを実行する必要がないことを Liquibase に示すことです。実際には、これは変更セットが正常に実行されたことを意味しますが、その結果、Liquibase はいずれにせよ再実行を試みることはありません。

于 2013-04-08T13:18:55.763 に答える