You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle数据库字符串数组类型选型及Liquibase配置问题

解决Oracle中Liquibase存储字符串数组的问题

Oracle不支持PostgreSQL风格的varchar(30)[]语法,要存储字符串数组,你可以选择以下几种方案:

方案1:使用自定义嵌套表类型

Oracle需要先定义集合类型,才能在表中使用数组列:

1. 创建自定义集合类型

添加changeSet创建嵌套表类型:

<changeSet id="1639718925269-0" author="bharatsuthar">
    <sql>
        CREATE TYPE permission_list AS TABLE OF VARCHAR2(30);
    </sql>
    <rollback>
        DROP TYPE permission_list;
    </rollback>
</changeSet>

2. 修改列类型为自定义集合

更新addColumn的changeSet:

<changeSet id="1639718925269-1" author="bharatsuthar">
    <addColumn tableName="users">
        <column name="permissions" type="permission_list"/>
    </addColumn>
</changeSet>

3. 插入数组数据

用valueComputed调用集合构造函数插入数据:

<changeSet id="1639718925270-1" author="sahilgoel">
    <insert tableName="users">
        <column name="user_id" value="hgw-rdk@telekom-digital.com"/>
        <column name="created_at" valueComputed="((SYSDATE - date '1970-01-01')*24*60*60*1000)"/>
        <column name="modified_at" valueComputed="((SYSDATE - date '1970-01-01')*24*60*60*1000)"/>
        <column name="permissions" valueComputed="permission_list('DOWNLOAD_PHASE_II_FILE','DOWNLOAD_PHASE_III_FILE','DOWNLOAD_MERGED_FILE','DOWNLOAD_ERROR_FILE')"/>
    </insert>
</changeSet>

方案2:使用JSON类型(Oracle 12c+)

如果你的Oracle版本是12c及以上,直接用JSON类型更简单,无需自定义类型:

1. 添加JSON列

<changeSet id="1639718925269-1" author="bharatsuthar">
    <addColumn tableName="users">
        <column name="permissions" type="JSON"/>
    </addColumn>
</changeSet>

2. 插入JSON数组

<changeSet id="1639718925270-1" author="sahilgoel">
    <insert tableName="users">
        <column name="user_id" value="hgw-rdk@telekom-digital.com"/>
        <column name="created_at" valueComputed="((SYSDATE - date '1970-01-01')*24*60*60*1000)"/>
        <column name="modified_at" valueComputed="((SYSDATE - date '1970-01-01')*24*60*60*1000)"/>
        <column name="permissions" value='["DOWNLOAD_PHASE_II_FILE","DOWNLOAD_PHASE_III_FILE","DOWNLOAD_MERGED_FILE","DOWNLOAD_ERROR_FILE"]'/>
    </insert>
</changeSet>

方案3:使用关联表(符合数据库范式)

如果不想用非标准类型,推荐用关联表存储权限,这是关系型数据库的标准设计方式:

1. 创建用户权限关联表

<changeSet id="1639718925269-0" author="bharatsuthar">
    <createTable tableName="user_permissions">
        <column name="user_id" type="VARCHAR2(100)">
            <constraints foreignKeyName="fk_user_permissions_user" references="users(user_id)" nullable="false"/>
        </column>
        <column name="permission" type="VARCHAR2(30)" nullable="false"/>
        <constraints primaryKeyName="pk_user_permissions" primaryKeyColumns="user_id, permission"/>
    </createTable>
</changeSet>

2. 插入用户及权限数据

<changeSet id="1639718925270-1" author="sahilgoel">
    <insert tableName="users">
        <column name="user_id" value="hgw-rdk@telekom-digital.com"/>
        <column name="created_at" valueComputed="((SYSDATE - date '1970-01-01')*24*60*60*1000)"/>
        <column name="modified_at" valueComputed="((SYSDATE - date '1970-01-01')*24*60*60*1000)"/>
    </insert>
    <insert tableName="user_permissions">
        <column name="user_id" value="hgw-rdk@telekom-digital.com"/>
        <column name="permission" value="DOWNLOAD_PHASE_II_FILE"/>
    </insert>
    <insert tableName="user_permissions">
        <column name="user_id" value="hgw-rdk@telekom-digital.com"/>
        <column name="permission" value="DOWNLOAD_PHASE_III_FILE"/>
    </insert>
    <insert tableName="user_permissions">
        <column name="user_id" value="hgw-rdk@telekom-digital.com"/>
        <column name="permission" value="DOWNLOAD_MERGED_FILE"/>
    </insert>
    <insert tableName="user_permissions">
        <column name="user_id" value="hgw-rdk@telekom-digital.com"/>
        <column name="permission" value="DOWNLOAD_ERROR_FILE"/>
    </insert>
</changeSet>

内容的提问来源于stack exchange,提问作者EV Experience

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:45:40