Nel mio progetto corrente, c'è un team di DB che controlla tutti gli script prima di applicarli alla produzione.Liquibase - genera script senza applicare changeset al database
Usiamo Liquibase per applicare i changeset allo sviluppo, ma per la produzione, dobbiamo essere in grado di generare un file * .sql con tutte le istruzioni.
Secondo la documentazione di liquibase-maven-plugin, updateSQL dovrebbe essere quello che voglio: http://www.liquibase.org/documentation/maven/maven_updatesql.html.
Così ho creato due profili Maven. Uno per applicare le modifiche al database di sviluppo locale (usando liquibase: aggiornamento) e un altro che avrebbe appena generato lo script. Il problema è: fare liquibase: updateSQL genera il file * .sql (come previsto), ma tenta anche di connettersi al database e applicare le modifiche (non previste). Credo che la documentazione per UpdateSQL conduce in errore, come si dice:
genera l'SQL che è necessario per aggiornare il database alla versione corrente come specificato nelle DatabaseChangeLogs.
Non fa alcun accenno a ciò che applicherebbe i changeset, come ad esempio il liquibase: l'aggiornamento lo fa.
Potrei essere in errore nella documentazione qui, ma non dovrebbe aggiornare SQL solo generare sql o dovrebbe effettivamente aggiornare + generare sql?
Ecco la mia configurazione del plugin:
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.0.5</version>
<configuration>
<changeLogFile>src/main/resources/db/liquibase_changeset.xml</changeLogFile>
<driver>oracle.jdbc.driver.OracleDriver</driver>
<url>${liquibase.db.url}</url>
<username>${liquibase.db.user}</username>
<password>${liquibase.db.password}</password>
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
</configuration>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>${liquibase.exec.goal}</goal>
</goals>
</execution>
</executions>
</plugin>
e ho creato i profili piace questo:
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<liquibase.exec.goal>update</liquibase.exec.goal>
<liquibase.exec.prompt>false</liquibase.exec.prompt>
<liquibase.db.url>jdbc:oracle:thin:@host:1521:xe</liquibase.db.url>
<liquibase.db.user>user</liquibase.db.user>
<liquibase.db.password>password</liquibase.db.password>
</properties>
</profile>
<profile>
<id>uat</id>
<properties>
<liquibase.exec.goal>updateSQL</liquibase.exec.goal>
<liquibase.exec.prompt>true</liquibase.exec.prompt>
<liquibase.db.url>jdbc:oracle:thin:@host2:1521:xe</liquibase.db.url>
<liquibase.db.user>user2</liquibase.db.user>
<liquibase.db.password>password2</liquibase.db.password>
</properties>
</profile>
</profiles>
Data la mia Maven config e la mia comprensione, mi sarei aspettato
mvn install -P uat
a solo generare lo script e non provare a connettersi al database.
Il fatto che sono costretto a specificare le proprietà del db (driver, ecc.) Mi fa pensare che questo sia destinato a cambiare sempre il database, ma suppongo che dovrebbe essere possibile generare lo script senza tentare di applicare le modifiche un database.
Qualche idea? È possibile ma sono completamente sulla strada sbagliata? O mi manca qualche proprietà semplice? O semplicemente non è supportato affatto?
Grazie in anticipo.
Ho avuto solo il tempo di esaminarlo di nuovo oggi. Sciocco, questo ha molto senso! Grazie – redwulf
Nota: se non si desidera alcuna interazione con il database, è ora disponibile la modalità offline http://www.liquibase.org/documentation/offline.html –