私はPostgresDBを使用しており、移行にはLiquibaseを使用しています。次の列を持つORDERSテーブルがあります。
ID | DATE | NAME | CREATOR | ...
注文を最後に変更したユーザーを保持する新しい列を追加する必要があります。この列はnull許容ではなく、デフォルト値であるCREATORである必要があります。新規注文の場合、ビジネスロジックのデフォルト値の部分を解決できますが、しかし既存の注文があり、デフォルト値を設定する必要があります新しい列を作成するとき。これで、ハードコードされた Liquibaseのデフォルト値 -を設定できることがわかりましたが、そのテーブルの他の列に基づいて(エンティティごとに)デフォルト値を追加する方法はありますか?.
ここでは誰も答えていないので、私はそれを処理した方法を投稿しています:
<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つの異なる変更セットで実行しました
プロシージャまたは関数の名前をとる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>
タグを使用してこれを行うこともできます。