Oracle 回滚addPrimaryKey也会删除相关的索引

Oracle 回滚addPrimaryKey也会删除相关的索引,oracle,liquibase,Oracle,Liquibase,在Oracle 11g下的liquibase 3.5.0中,我添加了以下变更集: <changeSet author="ME" id="PK_CREATION"> <createIndex tableName="MY_TABLE" indexName="MY_INDEX" unique="true"> <column name="ID

在Oracle 11g下的liquibase 3.5.0中,我添加了以下变更集:

  <changeSet author="ME" id="PK_CREATION">
    <createIndex tableName="MY_TABLE" indexName="MY_INDEX" unique="true">
      <column name="ID" />
    </createIndex>
    <addPrimaryKey tableName="MY_TABLE" columnNames="ID"
      constraintName="MY_PK" forIndexName="MY_INDEX" />
  </changeSet>

updateSQL
操作的结果是我所期望的:

在MY_表(ID)上创建唯一索引MY_索引

ALTER TABLE MY_TABLE使用索引MY_INDEX添加约束MY_PK主键(ID)

但是(默认)
rollbackSQL
操作会在第一条指令中主键的同时删除索引,这会导致第二条指令失败:

ALTER TABLE MY_TABLE DROP主键删除索引

删除索引MY_索引


有没有一种方法可以让它在不指定自定义回滚操作的情况下工作?

看起来自动生成的SQL for DROP主键总是包含DROP索引,并且已经有相当长的一段时间了。我不确定总是包含这一点的最初理由是什么,但由于这种方式已经有一段时间了,因此需要进行一些研究才能弄清楚为什么它是有意义的。我创建它是为了将其更多地作为4.0更改的一部分

目前,最简单的方法是添加一个自定义回滚块,该块只指定dropPrimaryKey:

<changeSet author="ME" id="PK_CREATION">
    <createIndex tableName="MY_TABLE" indexName="MY_INDEX" unique="true">
        <column name="ID" />
    </createIndex>
    <addPrimaryKey tableName="MY_TABLE" columnNames="ID"
                   constraintName="MY_PK" forIndexName="MY_INDEX" />
    <rollback>
        <dropPrimaryKey tableName="MY_TABLE"/>
    </rollback>
</changeSet>

有关编写扩展的更多信息。

此外,我怀疑是报告的原始Liquibase错误,根据该错误,一般情况下,删除Oracle中的唯一约束会以“删除索引”作为后缀,以删除约束使用的基础索引,无论基础索引是在创建约束时自动创建的,还是在已存在的情况下重新使用的

这对我来说是个问题

  • 已存在名为FOO的唯一索引
  • 创建了一个名为BAR的唯一约束(Oracle使用我以前创建的基础索引FOO)
  • 使用Liquibase使用dropUniqueConstraint标记,我原以为它只会删除BAR,但也意外地删除了FOO