2016-05-09 4 views
1

In liquibase 3.5.0 unter Oracle 11g fällt, habe ich die folgenden ChangeSet hinzugefügt:Rollbacks von addPrimaryKey auch zugehörige Index

<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> 

Das Ergebnis der updateSQL Betrieb ist, was ich erwarten:

CREATE UNIQUE INDEX MY_INDEX AUF MY_TABLE (ID);

ALTER TABLE MY_TABLE HINZUFÜGEN CONSTRAINT MY_PK PRIMÄRSCHLÜSSEL (ID) MIT INDEX MY_INDEX;

Aber die (default) rollbackSQL Betrieb fällt die gleichzeitig als Primärschlüssel in dem ersten Befehl des Index, der der zweite Befehl auszufallen verursacht:

ALTER TABLE MY_TABLE DROP PRIMARY KEY DROP INDEX;

DROP INDEX MY_INDEX;

Gibt es eine Möglichkeit, es ohne Angabe eines benutzerdefinierten Rollback-Vorgangs funktionieren zu lassen?

Antwort

1

Es sieht so aus, als ob das automatisch generierte SQL für DROP PRIMARY KEY immer DROP INDEX enthält und das seit einiger Zeit. Ich bin mir nicht sicher, was das ursprüngliche Grundprinzip war, das immer mit einzubeziehen, aber da es seit einer Weile so ist, braucht es einige Nachforschungen, um herauszufinden, warum es Sinn macht. Ich habe https://liquibase.jira.com/browse/CORE-2749 erstellt, um mehr als Teil der 4.0 Änderungen zu sehen.

Vorerst der einfachste Weg ist, einfach einen benutzerdefinierten Rollback-Block hinzufügen, die nur die dropPrimaryKey angibt:

<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> 

Andernfalls könnten Sie auch eine benutzerdefinierte Erweiterung des eigenen erstellen, die DropPrimaryKeyGenerator überschreibt und nicht umfassen die DROP INDEX Teil. Weitere Informationen zum Schreiben von Erweiterungen finden Sie unter http://liquibase.org/extensions.

0

Zusätzlich zu the answer provided by Nathan, vermute ich this die ursprüngliche Liquibase Bug berichtet, auf dem beschlossen wurde, dass allgemein, Abwurf einer Unique-Einschränkung in Oracle mit dem ‚DROP INDEX‘ nachgestellt wird, um den zugrunde liegenden Index durch die Einschränkung verwendet fallen , unabhängig davon, ob der zugrunde liegende Index beim Erstellen der Einschränkung automatisch erstellt wurde oder erneut verwendet wurde, da er bereits vorhanden war.

Das war problematisch für mich wie ich.

  1. ein bereits bestehender eindeutiger Index FOO benannt.
  2. erstellt eine eindeutige Einschränkung namens BAR (mit Oracle mit dem zugrunde liegenden Index FOO, die ich zuvor erstellt hatte).
  3. die dropUniqueConstraint-Tag mit Liquibase gebraucht, die ich nur BAR erwartet hatte wird entfernen, sondern auch FOO unerwartet entfernt.
Verwandte Themen