我们有两个项目。项目A是一个基本项目,提供基本功能,我们将在内部发布以供其他人构建,项目B是我们使用A的基本功能的特定项目。
项目A和B都使用相同的数据库并拥有自己的liquibase变更集。
我想修改一个项目A的基类,称之为实体。我们有一个entityId(与DB主键不同)字段,后来意识到它不需要,因为其他字段用于唯一标识该类。我们想从实体类和支持它的数据库中删除entityId。我更新了项目A的liquibase文件以删除entityId列。
然而,在项目B的某个时刻,有人决定他们想要重命名他们创建的一些实体。他们写入了项目B的liquibase变更集,用来自" foo"的entityId x重命名实体。到" bar"。这是旧版多变修订版的一部分。
问题是项目A的liquibase变更集在项目B之前运行。因此,A在B可以运行之前从实体表中删除entityId并重命名特定的实体" foo"去"酒吧"基于它的entityId,我得到一个例外,当我们尝试运行B的变更集时,entityId不存在。
我很乐意更改旧的变更集,根据名称进行重命名,即重命名名称为" foo"到" bar"。但是,我无法返回并修改旧的更改日志,因为显然在数据库中保存了校验和,如果我们更改文件,我们将获得校验和异常,主要是抱怨旧文件已更改。
所以我的问题是,人们如何处理这个问题?我可以在不破坏项目B的liquibase的情况下从项目A中删除entityId吗?
此外,这种做法是对的吗?我们是否通过让一个项目为一个实体创建表而另一个项目填充它来做错了什么?两个不同的项目可以为同一个数据库分别设置liquibase变更集,还是会导致问题?
答案 0 :(得分:1)
我不太清楚你在这里使用“项目”是什么意思,但我认为这意味着我所谓的“团队”。
无论哪种方式,看起来你的上一个问题的答案是肯定的,你做错了什么。我猜这个“东西”是你的两个项目没有共享相同的代码库。
如果他们 共享代码库,则应用第二次更改的人会意识到第一次更改已存在,只是因为他们在更新代码时已经看到了版本控制存储库。
因此,对于未来,答案是您的项目需要共享公共代码,包括Liquibase更改集。
但这并不能帮助你从现在的位置恢复。你应该承认改变已经运行的变更集是不明智的。但是有很多方法可以解决这个问题。例如,您可以从DATABASECHANGELOG
删除关联的行。
事实上,最简单的解决方案可能是确保项目A的变更集在项目B之后运行。这样就会发生重命名,然后列就会被删除。
虽然你也必须考虑,毕竟你的entityId
专栏 ,因为项目B似乎正在利用它。
如果由于某种原因你无法做到这一点,那么你应该能够通过合理使用<preConditions>
元素来解决这个问题。这将允许您执行或不执行特定的更改集,具体取决于架构的状态。