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
相关产品推荐
相关产品推荐

