2012-06-21 10 views
21

Ich habe das Maven Pluggin für liquibase wie in maven configuration angegeben konfiguriert.
erstellt nun eine changeset wie: -So kennzeichnen Sie einen Änderungssatz in liquibase zum Rollback

<changeSet id="changeRollback" author="nvoxland"> 
    <createTable tableName="changeRollback1"> 
    <column name="id" type="int"/> 
    </createTable> 
    <rollback> 
    <dropTable tableName="changeRollback1"/> 
    </rollback> 
</changeSet> 

die SQL Erstellt DB mit der Befehlszeile zu aktualisieren: - mvn liquibase: UpdateSQL

Aber möchte nur wissen, wie man einen „rollbackTag rückgängig zu machen mit "Parameter. . Wenn der Befehl "mvn liquibase: rollbackSQL" ausgeführt wird, was sollte der Wert des Parameters "rollbackTag" sein.

Und ist es möglich, Rollback mit der Changeset-ID?

+4

Du bist nicht Nathon voxland :-) –

Antwort

35

Rollback-Tags dienen zum Überprüfen der Konfiguration Ihrer Datenbank.

Die folgenden Befehle werden die Datenbankkonfiguration zurück von 3 Change rollen und einen Tag als „Checkpoint“ erstellen:

mvn liquibase:rollback -Dliquibase.rollbackCount=3 
mvn liquibase:tag -Dliquibase.tag=checkpoint 

Sie können nun die Datenbank aktualisieren und zu jedem Zeitpunkt Zurückkehren zu diesem Punkt mit dem Rollback tag:

mvn liquibase:rollback -Dliquibase.rollbackTag=checkpoint 

oder alternativ die Rollback-SQL erzeugen:

mvn liquibase:rollbackSQL -Dliquibase.rollbackTag=checkpoint 

Überarbeitetes Beispiel

Ich fand es anfangs schwierig herauszufinden, wie das Liquibase Maven Plugin zu konfigurieren ist. Nur für den Fall, dass es hier hilft, ist das Beispiel, das ich verwendet habe.

Das Liquibase-Update ist so konfiguriert, dass es automatisch ausgeführt wird. Anschließend wird die Datenbank mit der aktuellen Maven-Revisionsnummer markiert.

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.myspotontheweb.db</groupId> 
    <artifactId>liquibase-demo</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <properties> 
     <!-- Liquibase settings --> 
     <liquibase.url>jdbc:h2:target/db1/liquibaseTest;AUTO_SERVER=TRUE</liquibase.url> 
     <liquibase.driver>org.h2.Driver</liquibase.driver> 
     <liquibase.username>user</liquibase.username> 
     <liquibase.password>pass</liquibase.password> 
     <liquibase.changeLogFile>com/myspotontheweb/db/changelog/db-changelog-master.xml</liquibase.changeLogFile> 
     <liquibase.promptOnNonLocalDatabase>false</liquibase.promptOnNonLocalDatabase> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <version>1.3.162</version> 
     </dependency> 
    </dependencies> 
    <profiles> 
     <profile> 
      <id>dbupdate</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.liquibase</groupId> 
         <artifactId>liquibase-maven-plugin</artifactId> 
         <version>2.0.2</version> 
         <executions> 
          <execution> 
           <phase>process-resources</phase> 
           <configuration> 
            <tag>${project.version}</tag> 
           </configuration> 
           <goals> 
            <goal>update</goal> 
            <goal>tag</goal> 
           </goals> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 

Liquibase jetzt als Teil des Standard-Lebenszyklus konfiguriert ist, kann so wie folgt ausgeführt werden:

mvn clean compile 
+0

Vielen Dank [Mark O'Connor] (http://stackoverflow.com/users/256618/mark-oconnor). In der obigen Konfiguration ist es möglich, "Tag" Ziel zusammen mit "Update" -Ziel hinzuzufügen. Könnten Sie bitte den vollen mvn Befehl geben, um ihn auch auszuführen. Danke im Advance – Manu

+0

@gfghj Beispiel aktualisiert wie angefordert –

+0

Beim Versuch, RollbackSQL zu erstellen, habe ich den Fehler: - [INFO] Fehler beim Einrichten oder Ausführen von Liquibase: liquibase.exception.RollbackImpossibleException: Keine inverse zu liquibase.change.core.UpdateDataChange erstellt – Manu

12

ich persönlich den Tag als Teil der changeset Dateien setzen bevorzugen, wenn Sie also müssen alle Datensätze in der DATABASECHANGELOG Rollback oder löschen Sie Ihre Tagging-Datensätze nicht verlieren.

<databaseChangeLog> 
    <changeSet id="001_create_tables" .../> 
    <changeSet id="002_alter_tables" .../> 
    <changeSet id="003_load_user_data" .../> 

    <!-- Also include the tagging itself as a changeSet... --> 
    <changeSet author="userId" id="tag_version_0_1_0"> 
     <tagDatabase tag="version_0.1.0" /> 
    </changeSet> 
    <!-- version 0.1.0 ends here --> 

</databaseChangeLog> 
+0

Vielen Dank. Ich habe das Maven-Ziel RollbackSQL erstellt und in der Konfiguration das Tag Version_0.1.0 hinzugefügt. Aber wenn ich das Ziel rollbackSQL ausführe, erzeugt es das Rollback-Skript nicht. Wenn ich jedoch die Anzahl der Rollbacks unter Verwendung von 2 festlege, werden die Rollback-Skripts für die letzten beiden Changesets erstellt. Irgendeine Idee, warum das Rollback-Skript nicht generiert wurde? – Manu

+0

Haben Sie versucht, den Befehl rollbackSQL direkt über die Befehlszeile von liquibase zu starten? Nur um sicher zu sein, dass der aktuelle Status Ihres DB-Schemas und der Status, auf den sich Ihr Tag bezieht, unterschiedlich sind, muss der Befehl also etwas SQL ergeben. – kothvandir

+0

Nein. Ich habe es mit Maven-Plugin ausgeführt. Aber ich konnte sehen, dass das Tag im generierten SQL hinzugefügt wurde, wenn ich das updateSQL-Ziel ausführte und ich die Datenbank damit aktualisierte. Ich bin sicher, dass die Tags nicht anders sind. – Manu

Verwandte Themen