回滚addPrimaryKey也会丢弃关联的索引

时间:2016-05-09 10:15:26

标签: oracle liquibase

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

  <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_TABLE(ID)上创建UNIQUE INDEX MY_INDEX;

     

ALTER TABLE MY_TABLE添加约束MY_PK PRIMARY KEY(ID)使用INDEX MY_INDEX;

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

  

ALTER TABLE MY_TABLE DROP PRIMARY KEY DROP INDEX;

     

DROP INDEX MY_INDEX;

有没有办法让它工作而不指定自定义回滚操作?

2 个答案:

答案 0 :(得分:1)

看起来DROP PRIMARY KEY的自动生成的SQL总是包含DROP INDEX并且已经有很长一段时间了。我不确定最初的理由是什么总是包括那个但是因为它已经有一段时间了,所以需要进行一些研究来找出它为什么有意义。我创建https://liquibase.jira.com/browse/CORE-2749以便在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>

否则,您还可以创建自己的自定义扩展,覆盖DropPrimaryKeyGenerator而不包括DROP INDEX部分。有关编写扩展的详细信息,请参阅http://liquibase.org/extensions

答案 1 :(得分:0)

the answer provided by Nathan之后,我怀疑this是报告的原始Liquibase错误,在此基础上决定通常在Oracle中删除一个唯一约束后面的&#39; DROP INDEX& #39;删除约束使用的基础索引,不管底层索引是在创建约束时是自动创建的,还是重新使用,因为它已经存在。

这对我来说就像我一样有问题。

  1. 一个名为 FOO 的已存在唯一索引。
  2. 创建了一个名为 BAR 的唯一约束(Oracle使用我之前创建的基础索引FOO)。
  3. 使用liquibase的dropUniqueConstraint标签,我原本预计只会删除 BAR ,但也会意外删除 FOO