【问题标题】:Does liquibase recognize if table is already up to date before executing changeSet?liquibase 是否在执行 changeSet 之前识别表是否已经是最新的?
【发布时间】:2014-10-21 22:36:30
【问题描述】:

在我们的例子中,liquibase 用于更新现有安装的数据库。新安装已经是最新的。

假设我们有一个新的安装。启动应用程序将强制执行 liquibase 变更集(例如更改列的类型),但正如我之前提到的,由于列已使用正确的类型创建,因此无需更新任何内容。

liquibase 是否识别出表列已经是最新的,或者它是否尝试执行变更集,因为 databasechangelog 表中没有对应的条目?

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    Liquibase 使用了一种替代方法,可以避免分析目标数据库的数据字典。这使得数据库操作更简单,更跨平台。

    一个特殊的表“DATABASECHANGELOG”记录了应用于目标数据库实例的变更集。该表还包含一个校验和(在运行时计算),以确定在 liquibase 运行之间是否更改了变更集。

    因此,如果您更改了表列的类型,liquibase 可以检测到这一点并在针对现有数据库运行时抛出错误。 (显然,在新数据库上,该表将按预期创建)。

    最后,changeset documentation 描述了两个可选属性(“runAlways”和“runOnChange”),它们可以告诉 lqiuibase 多次将变更集重新应用到数据库。还有一个"clearCheckSums" command 可用于重置现有数据库的校验和。显然你需要知道你在使用这样一个选项时在做什么:-)

    【讨论】:

    • 感谢您的回答。我知道 Liquibase 在 DATABASECHANGELOG 表中保持其状态。我的问题是另一个:因为我们有一个新安装,所以数据库是最新的,但是变更集(为更新软件而定义)没有运行,也不应该被执行,因为它们只是试图更新已经存在的内容。但是 DATABASECHANGELOG 中没有执行的条目。 Liquibase 是否检测到变更集只会更改已经存在的内容而不执行语句,或者它是否会执行语句?谢谢
    • @ms.oe 检查“changelogSync” liquibase 命令:liquibase.org/documentation/command_line.html
    • 希望这很清楚,但是如果您以某种方式知道数据库实际上与更改日志“同步”,则应仅使用 changelogSync 命令。运行该命令时,Liquibase 不会对实际的数据库结构进行任何检查。
    • @SteveDonie 没错。它实际上只是将变更集标记为已执行。
    【解决方案2】:

    Liquibase 不会自动识别任何东西。

    但是你可以在你的changeSet中使用preConditions/>来检查你的changeSet是否必须被应用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2020-12-29
      • 2021-08-06
      • 1970-01-01
      • 2011-11-21
      • 2012-06-10
      相关资源
      最近更新 更多