Liquibase生成的SQL给ORA-01735错误

时间:2018-03-02 16:45:16

标签: oracle oracle11g liquibase oracle12c

我在Oracle 12数据库(最新的官方docker镜像)上运行以下变更集。执行更改集时,出现SQL错误:

Error: ORA-01735: invalid ALTER TABLE option
 [Failed SQL: ALTER TABLE TEST.LANGUAGE ADD CONSTRAINT SYS_C0010528 PRIMARY KEY (ID) USING INDEX TEST.SYS_C0010528]

我使用Liquibase工具从现有的Oracle数据库模式生成变更集,并进行了少量更改。

liquibase不支持Oracle 12吗?

如何配置liquibase以生成与Oracle 12兼容的SQL?

这是设置问题,还是Liquibase中的错误?

详细说明:

看起来Oracle不接受USING INDEX语句中索引名称的限定符。以下修订的SQL似乎按预期工作:

ALTER TABLE TEST.LANGUAGE ADD CONSTRAINT SYS_C0010528 PRIMARY KEY (ID) USING INDEX SYS_C0010528

以下是变更集定义:

<changeSet author="rmorrise (generated)" id="1507039841670-7">
    <preConditions onFail="MARK_RAN">
        <not>
            <primaryKeyExists tableName="LANGUAGE"/>
        </not>
    </preConditions>
    <createIndex indexName="SYS_C0010528" tableName="LANGUAGE" unique="true">
        <column name="ID"/>
    </createIndex>
    <addPrimaryKey columnNames="ID" constraintName="SYS_C0010528" forIndexName="SYS_C0010528" tableName="LANGUAGE"/>
</changeSet>

更新

我修改了<addPrimaryKey>条目,将其替换为<sql>代码,但<addUniqueConstraint> forIndexName时出现了相同的错误。

以下是生成的用于创建索引的SQL。它似乎是在同一架构中创建的。

CREATE UNIQUE INDEX TEST.UK46FCA532E38E4F92860631AA28CB ON TEST.MESSAGE_ROLE(TEMPLATE_ID, LABEL);

ALTER TABLE TEST.MESSAGE_ROLE ADD CONSTRAINT UK46FCA532E38E4F92860631AA28CB UNIQUE (TEMPLATE_ID, LABEL) USING INDEX TEST.UK46FCA532E38E4F92860631AA28CB;

回答Alex关于系统对象名称使用的问题:架构最初由hbm2ddl生成,并使用generateChangelog迁移到liquibase。

对dba_objects的查询确认OWNER是 TEST

1 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,在阅读本主题时,我发现我们都将架构命名为“TEST”。 我更改了架构的名称,它立即生效。