【发布时间】:2014-02-12 14:08:03
【问题描述】:
我正在尝试将 Liquibase 与我们的 Spring/Hibernate 网络应用程序集成,以取代我们现有的本土解决方案。到目前为止,Liquibase 很棒,但有一个用例对我们很重要,我不知道 Liquibase 是否支持它,就是这样:
我们将我们的网络应用程序部署到自己托管网络应用程序和数据库 (MySQL) 的客户。因此,假设我们使用新的干净 DB 模式(从 Hibernate 映射生成)部署到我们的第一个客户端(client1),并且 Liquibase 变更集中没有项目。然后我们开发一些模式更改并将应用程序重新部署到 client1,然后 liquibase 完成它的工作并应用更改集——到目前为止一切都很好。
现在,我们再次使用从 Hibernate 映射生成的新数据库模式部署到新客户端 client2。但是这一次,存在变更集(对于 client1 和 client2 部署之间所做的更改),但不需要应用它们,因为它们已经在新模式中)。但是,由于 DATABASECHANGELOG 表是空的,Liquibase 将尝试应用变更集,并且可能会因 SQL 错误而失败。 我们希望新客户端的新部署能够“了解”它们是什么变更集(相对于客户端 1 的第一次部署),因此它只应用后续更新。
这似乎有几种可能性,可能更多的是我没有想到的:
用虚假条目填充 DATABASECHANGELOG 以欺骗 Liquibase 以为这些条目已被应用。
始终将我们的第一个基线原始架构部署到后续客户端,并按顺序运行更新,因此永远不要在客户端 1 之后部署从 Hibernate 映射派生的“新”架构。
使用我们自己的跟踪系统(例如,将数据库版本映射到应用程序版本,将数据库版本映射到变更集)。
这是一个问题,还是我只是不明白如何正确使用 Liquibase?非常感谢以前处理过此类用例的人的任何建议。如果可能的话,我们真的很想避免特定于部署的变更集 - 将有几十个,如果不是数百个部署要处理。
谢谢, 理查德
【问题讨论】: