在我目前的项目中,有一个数据库团队在将所有脚本应用到生产之前检查所有脚本。
我们正在使用Liquibase将更改集应用于开发,但是对于生产,我们需要能够生成包含所有语句的* .sql文件。
根据liquibase-maven-plugin的文档,updateSQL应该是我想要的:http://www.liquibase.org/documentation/maven/maven_updatesql.html。
所以我创建了两个maven配置文件。一个用于将更改应用于本地开发数据库(使用liquibase:update),另一个用于生成脚本。问题是:执行liquibase:updateSQL会生成* .sql文件(如预期的那样),但它也会尝试连接到数据库并应用更改(不是预期的)。我相信updateSQL的文档会导致错误,因为它说:
生成将数据库更新到的所需的SQL DatabaseChangeLogs中指定的当前版本。
没有提及它会实际应用更改集,例如liquibase:update确实。
我可能会误解这里的文档,但是不应该更新SQL只生成sql或者它应该实际更新+生成sql?
这是我的插件配置:
<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>
我创建了这样的个人资料:
<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>
鉴于我的maven配置和我的理解,我希望
mvn install -P uat
仅生成脚本而不是尝试连接数据库。
我被迫指定数据库属性(驱动程序等)的事实使我相信这是为了始终更改数据库,但我想应该可以生成脚本而不尝试对数据库应用更改数据库中。
有什么想法?是否有可能,但我完全走错了路?或者我错过了一些简单的财产?或者根本不支持它?
提前致谢。
答案 0 :(得分:11)
UpdateSQL实际上并不更新数据库,只是输出SQL。
它需要数据库连接信息并建立实际连接的原因是因为它需要从databasechangelog表中选择以确定哪些changeSet已经运行,哪些没有。