10

データベースの変更を追跡するためにliquibaseを使用します。最初のchangeSetには次の行が含まれています。

<column name="SHORT_ID" type="INTEGER">
   <constraints unique="true" />
</column>

基本的には、SHORT_ID列に一意の制約があることを意味しますが、この制約の名前は任意であり、通常は毎回異なります(H2データベースに対していくつかの統合テストを実行し、テストを実行するたびに新しいベースが作成されます)

したがって、問題は次のとおりです。この最初のchangeSetを変更することはできませんが、この一意の制約を取り除く必要があります。liquibaseを使用してそれを達成する方法はありますか?

4

3 に答える 3

7

Liquibase は、制約名を知らなくても null でない制約を削除するための実装を提供します。この質問がされたときには存在していなかった可能性があります (かなり古いものだと思います)。

dropNotNullConstraint

<dropNotNullConstraint catalogName="cat"
            columnDataType="int"
            columnName="id"
            schemaName="public"
            tableName="person"/>

dropUniqueConstraintは存在​​しますが、制約名が必要なため、すでにご存知でしょう

于 2014-04-15T23:19:42.770 に答える
5

制約を削除するためのH2のSQLには、制約名が必要です。H2で自動生成された制約名がランダムであるか、データベース間で一貫しているのかは覚えていません。

一定の場合は、通常のliquibaseタグを使用でき、正常に機能します。

ランダムな場合は、information_schemaから制約名を取得する必要があります。H2は次のようなものを許可する可能性があります:

alter table TABLE_NAME drop constraint 
      (select unique_index_name 
              from information_schema.constraints 
              where table_name='TABLE_NAME' and column_name='SHORT_ID')

そうでない場合は、呼び出しを行って制約を削除するカスタムliquibaseの変更(http://liquibase.org/extensions with 2.0、http://www.liquibase.org/manual/custom_refactoring_class in 1.9)を作成する必要がある場合があります。

于 2010-09-01T16:57:05.317 に答える
1

HSQL の場合、ネイサンが提案したクエリは機能しません (テーブル TABLE_NAME ドロップ制約を変更します (table_name='TABLE_NAME' および column_name='SHORT_ID' である information_schema.constraints から unique_index_name を選択します))。

これは、DDL と SQL を混在させることができないためです。

実行時に名前を知って制約を削除することは、HSQL では不可能のようです (制約のある列を削除する前に、ロールバックでこれが必要です)。これは、Oracle と MSSQL で可能です。

私がしているのは、hbm ファイル (休止状態) を介して生成されたデータベースを取得することです。hibernate は一意のキー制約の命名をサポートしていないため、たとえば、これらの列を制約付きで削除することは、liquibase (HSQL 用) を使用して行うことはできません。全体をテストする HSQL に基づくテストがあります。HSQLのソリューションを入手するとよいでしょう。

今のところ、Unique 制約名をハード コードするだけです (回避策)。

于 2013-05-13T09:16:22.473 に答える