Liquibase:如何检查前提条件是否列已具有默认值

问题描述 投票:0回答:1

我有一个表 T,其中包含 C 列,已在生产中使用。由于一些需求更改,现在我想向此列添加默认值 X (Varchar2)。更简单的方法是在 liquibase 中编写

addDefaultValue
标签,这将简单地向 C 添加默认值。但是,每次运行此脚本时,它都会尝试为此列设置默认值。我想要一种在前提条件期间可以验证该列是否具有默认值的方法,如果有的话,Mark Ran。我找不到有关这种情况的先决条件的任何具体信息。可以吗?

sql oracle spring-boot liquibase
1个回答
0
投票

以下是如何构建 Liquibase 变更集以仅在默认值不存在时添加默认值的示例:

<changeSet author="yourname" id="addDefaultValueToColumn">
    <preConditions onFail="MARK_RAN">
        <!-- Check if the default value is not already set -->
        <sqlCheck expectedResult="0">
            SELECT COUNT(*)
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'T'
            AND COLUMN_NAME = 'C'
            AND COLUMN_DEFAULT IS NOT NULL;
        </sqlCheck>
    </preConditions>
    
    <!-- Add default value only if the precondition is met -->
    <addColumn tableName="T">
        <column name="C" type="VARCHAR2(255)">
            <constraints nullable="true"/>
            <defaultValueComputed>X</defaultValueComputed>
        </column>
    </addColumn>
</changeSet>

前置条件用于在应用更改之前执行 SQL 查询。在本例中,它通过查询 INFORMATION_SCHEMA.COLUMNS 视图来检查表 T 中的列 C 是否已经具有默认值。 ExpectedResult="0" 表示仅当查询返回零行时前提条件才会通过。

如果满足前提条件(即默认值不存在),则更改会将默认值添加到列中。

此方法允许您根据数据库的现有状态有条件地应用更改。请注意,特定的 SQL 查询可能需要根据您使用的数据库系统进行调整。示例查询是基于您使用支持 INFORMATION_SCHEMA 标准的数据库的假设编写的。

在将 Liquibase 更改应用于生产之前,请始终在非生产环境中测试它们。此外,请检查 Liquibase 文档和发行说明,了解与先决条件相关的任何更新或新功能,因为该工具正在积极开发中。

© www.soinside.com 2019 - 2024. All rights reserved.