addPrimaryKey 的回滚也会删除关联的索引

rollback of addPrimaryKey also drops associated index

在 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操作的结果是我所期望的:

CREATE UNIQUE INDEX MY_INDEX ON MY_TABLE(ID);

ALTER TABLE MY_TABLE ADD CONSTRAINT MY_PK PRIMARY KEY (ID) USING INDEX MY_INDEX;

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

ALTER TABLE MY_TABLE DROP PRIMARY KEY DROP INDEX;

DROP INDEX MY_INDEX;

有没有办法在不指定自定义回滚操作的情况下使其工作?

看起来自动生成的 SQL 为 DROP PRIMARY KEY 总是包含 DROP INDEX 并且已经有一段时间了。我不确定始终包含该内容的最初理由是什么,但由于这种方式已经存在了一段时间,因此需要进行一些研究才能弄清楚为什么它有意义。作为 4.0 更改的一部分,我创建了 https://liquibase.jira.com/browse/CORE-2749 来更多地研究它。

目前,最简单的方法是仅添加一个仅指定 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

进一步 , I suspect this 是报告的原始 Liquibase 错误,据此决定通常,在 Oracle 中删除唯一约束后缀 'DROP INDEX' 以删除 Oracle 使用的基础索引约束条件,无论基础索引是在创建约束条件时自动创建的,还是因为它已经存在而被重新使用。

这对我来说是个问题。

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