在我们的案例中,liquibase用于更新现有安装的数据库。新的安装已经是最新的。
假设我们有一个新的装置。启动应用程序将强制执行liquibase变更集(例如,更改列的类型),但正如我之前提到的,没有什么可更新的,因为该列已经使用正确的类型创建。
liquibase是否识别出表列已经是最新的,或者它是否试图执行变更集,因为数据库中没有针对它的条目changelog表?
Liquibase使用了另一种方法,可以避免分析目标数据库的数据字典。这使得数据库操作更简单,更跨平台。
一个特殊的表"DATABASECHANGELOG"记录了应用于目标数据库实例的变更集。该表还包含一个校验和(在运行时计算),用于确定在liquibase的运行之间是否更改了更改集。
因此,如果您更改了表列的类型,liquibase可以检测到这一点,并在对现有数据库运行时抛出错误。(显然,在一个新的DB上,表将按预期创建)。
最后,变更集文档描述了两个可选属性("runAlways"one_answers"runOnChange"),它们可以告诉lqiuibase将变更集多次重新应用到数据库。还有一个"clearCheckSums"命令,可用于重置现有数据库上的校验和。显然,当使用这样的选项时,您需要知道自己在做什么:-)
Liquibase不会自动识别任何内容。
但是您可以使用<前提条件/>在您的变更集中检查是否必须应用您的变更集。