web-dev-qa-db-ja.com

Liquibaseの既存の列からデフォルト値で新しい列を追加する方法

私はPostgresDBを使用しており、移行にはLiquibaseを使用しています。次の列を持つORDERSテーブルがあります。

ID | DATE | NAME | CREATOR | ...

注文を最後に変更したユーザーを保持する新しい列を追加する必要があります。この列はnull許容ではなく、デフォルト値であるCREATORである必要があります。新規注文の場合、ビジネスロジックのデフォルト値の部分を解決できますが、しかし既存の注文があり、デフォルト値を設定する必要があります新しい列を作成するとき。これで、ハードコードされた Liquibaseのデフォルト値 -を設定できることがわかりましたが、そのテーブルの他の列に基づいて(エンティティごとに)デフォルト値を追加する方法はありますか?.

9
Noam

ここでは誰も答えていないので、私はそれを処理した方法を投稿しています:

<changeSet id="Add MODIFY_USER_ID to ORDERS" author="Noam">
        <addColumn tableName="ORDERS">
            <column name="MODIFY_USER_ID" type="BIGINT">
                <constraints foreignKeyName="ORDERS_MODIFY_FK" referencedTableName="USERS" referencedColumnNames="ID"/>
            </column>
        </addColumn>
</changeSet>

<changeSet id="update the new MODIFY_USER_ID column to get the CREATOR" author="Noam">
    <sql>update ORDERS set MODIFY_USER_ID = CREATOR</sql>
</changeSet>

<changeSet id="Add not nullable constraint on MODIFY_USER_ID column" author="Noam">
    <addNotNullConstraint tableName="ORDERS" columnName="MODIFY_USER_ID" columnDataType="BIGINT"/>
</changeSet>

ドキュメントで推奨されているように、これを3つの異なる変更セットで実行しました

20
Noam

プロシージャまたは関数の名前をとるdefaultValueComputed属性を使用できます。プロシージャを作成するチェンジセットも作成する必要があります。

それは何かこのように見えるかもしれません:

<changeSet author="steve" id="createProcedureForDefaultValue">
    <createProcedure procedureName="myCoolProc">
    CREATE OR REPLACE PROCEDURE myCoolProc IS
    BEGIN
       -- actual logic here
    END;
    </createProcedure>
</changeSet>

<changeSet author="steve" id="addDefaultValueColumn">
    <addColumn tableName="ORDERS">
        <column name="LAST_MODIFIED_BY" type="VARCHAR" defaultValueComputed="myCoolProc">
            <constraints nullable="false"/>
        </column>
    </addColumn>
</changeSet>

または、<sql>タグを使用してこれを行うこともできます。

3
SteveDonie