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

Liquibase同一changeSet中同时使用modifySql与sql标签报错

解决Liquibase的cvc-complex-type.2.4.a错误

这个错误的核心原因是你在changeSet里的元素结构不符合Liquibase的XML Schema规范:modifySql必须是对应数据库操作(比如这里的createTable)的子元素,而不是和createTable平级放置,同时你的<sql>元素被错误地解析到了createTable的上下文里,导致Schema校验失败。

你可以调整changeSet的结构,把两个modifySql标签嵌套到createTable内部,然后将<sql>作为独立的操作放在changeSet里,修改后的代码如下:

<changeSet id="18.7.0.1-1-userTable" author="so">
    <preConditions onFail="MARK_RAN">
        <not>
            <tableExists tableName="USER_CURRENT"/>
        </not>
    </preConditions>
    <createTable tableName="USER_CURRENT">
        <column name="name" type="VARCHAR(20)">
            <constraints primaryKey="true" nullable="false" primaryKeyName="name"/>
        </column>
        <!-- 将modifySql移到createTable内部,作为该操作的子元素 -->
        <modifySql dbms="mysql">
            <append value=" PARTITION BY KEY() PARTITIONS 16"/>
        </modifySql>
        <modifySql dbms="oracle">
            <append value=" ORGANIZATION INDEX PARTITION BY HASH (name) PARTITIONS 16 PARALLEL 4"/>
        </modifySql>
    </createTable>
    <!-- sql作为独立的数据库操作,和createTable平级放置 -->
    <sql>GRANT SELECT ON USER_CURRENT TO 'reportsUser'@'%';</sql>
</changeSet>

这样调整后就能解决问题:

  • modifySql现在属于createTable的子元素,符合Liquibase的规范,它会专门针对createTable生成的SQL进行定制修改
  • <sql>作为独立的操作放在changeSet中,不会再被错误解析到createTable的上下文里,Schema校验就能顺利通过

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:09:01