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 使用的基础索引约束条件,无论基础索引是在创建约束条件时自动创建的,还是因为它已经存在而被重新使用。
这对我来说是个问题。
- 一个已经存在的名为 FOO.
的唯一索引
- 创建了一个名为 BAR 的唯一约束(Oracle 使用我之前创建的基础索引 FOO)。
- 使用 Liquibase 的 dropUniqueConstraint 标签,我原以为它只会删除 BAR 但意外地删除了 FOO.
在 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。
进一步
这对我来说是个问题。
- 一个已经存在的名为 FOO. 的唯一索引
- 创建了一个名为 BAR 的唯一约束(Oracle 使用我之前创建的基础索引 FOO)。
- 使用 Liquibase 的 dropUniqueConstraint 标签,我原以为它只会删除 BAR 但意外地删除了 FOO.