Noa*_*oam 8 java migration postgresql liquibase
我正在使用Postgres DB并进行迁移我正在使用Liquibase.我有一个包含以下列的ORDERS表:
ID | DATE | NAME | CREATOR | ...
Run Code Online (Sandbox Code Playgroud)
我需要添加一个新列,该列将保留上次修改订单的用户 - 此列应该是不可为空的,并且应该具有默认值,即CREATOR.对于新订单,我可以解决业务逻辑的默认值部分,但事情是我已经有了现有订单,我需要在创建新列时设置默认值.现在,我知道我可以在Liquibase中设置一个硬编码的默认值 - 但是有一种方法可以根据该表的其他一些列(对于每个实体)添加默认值.
Noa*_*oam 20
由于没有人在这里回答我发布我处理它的方式:
<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>
Run Code Online (Sandbox Code Playgroud)
我在文档推荐的三个不同的变更集中完成了这个
您可以使用该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>
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用<sql>标签来执行此操作。
| 归档时间: |
|
| 查看次数: |
11133 次 |
| 最近记录: |