Oracle 回滚addPrimaryKey也会删除相关的索引
在Oracle 11g下的liquibase 3.5.0中,我添加了以下变更集: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
<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