2012-06-21 12 views
21

Ho configurato il maven pluggin per liquibase come specificato in maven configuration.
creato un insieme di modifiche come: -Come taggare un changeset in liquibase per il rollback

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

creato lo SQL per aggiornare DB tramite riga di comando: - mvn liquibase: UpdateSQL

Ma vogliono sapere come eseguire il rollback utilizzando un "rollbackTag "parametro. Ad esempio, se si esegue il comando "mvn liquibase: rollbackSQL", quale dovrebbe essere il valore del parametro "rollbackTag".

E è possibile eseguire il rollback utilizzando l'id del changeset?

+4

Tu non sei Nathon voxland :-) –

risposta

35

I tag di rollback sono progettati per il checkpoint della configurazione del database.

I seguenti comandi rotolare la configurazione del database back da 3 gruppi di modifiche e creare un tag chiamato "checkpoint":

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

È ora possibile aggiornare il database, e in qualsiasi rollback fase a quel punto utilizzando il rollback tag:

mvn liquibase:rollback -Dliquibase.rollbackTag=checkpoint 

o in alternativa generare l'SQL di rollback:

mvn liquibase:rollbackSQL -Dliquibase.rollbackTag=checkpoint 

Esempio rivisto

Inizialmente ho trovato difficile capire come configurare il plugin Maven di liquibase. Nel caso in cui aiuti, ecco l'esempio che ho usato.

L'aggiornamento di liquibase è configurato per l'esecuzione automatica, seguito dalla codifica del database con il numero di revisione Maven corrente.

<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 è ora configurato come parte del ciclo di vita standard in modo può essere eseguito come segue:

mvn clean compile 
+0

Grazie mille [Mark O'Connor] (http://stackoverflow.com/users/256618/mark-oconnor). Nella configurazione di cui sopra, è possibile aggiungere l'obiettivo "tag" insieme all'obiettivo "aggiornamento". Potresti dare il comando mvn completo per eseguirlo anche tu. Grazie in anticipo – Manu

+0

@gfghj Esempio aggiornato come richiesto –

+0

Durante il tentativo di creare rollbackSQL, ho ricevuto l'errore: - [INFO] Errore durante l'impostazione o l'esecuzione di Liquibase: liquibase.exception.RollbackImpossibleException: No inverso per liquibase.change.core.UpdateDataChange creato – Manu

12

Io personalmente preferisco mettere il tag come parte dei file changeset, quindi se si è necessario eseguire il rollback o eliminare tutti i record nello DATABASECHANGELOG per non perdere i record di codifica.

<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

Grazie mille. Ho creato l'obiettivo Maven rollbackSQL e nella configurazione aggiunto il tag version_0.1.0 . Ma quando eseguo l'obiettivo rollbackSQL, non viene generato lo script di rollback. Ma se si specifica il conteggio dei rollback utilizzando 2 gli script di rollback vengono creati per gli ultimi due changeset. Qualche idea sul perché lo script di rollback non è stato generato? – Manu

+0

Hai provato a lanciare il comando rollbackSQL direttamente dalla riga di comando di liquibase? solo per essere sicuro che lo stato corrente del tuo schema DB e lo stato riferito dal tuo tag siano diversi e quindi il comando deve dare origine ad alcuni SQL. – kothvandir

+0

No. Lo ho eseguito usando il plugin Maven. Ma ho potuto vedere il tag è stato aggiunto nell'SQL generato quando si esegue l'obiettivo updateSQL e ho aggiornato il DB con esso. Sono sicuro che i tag non sono diversi. – Manu

Problemi correlati