我在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 。
答案 0 :(得分:2)
我遇到了类似的问题,在阅读本主题时,我发现我们都将架构命名为“TEST”。 我更改了架构的名称,它立即生效。