从Liquibase表中确定DB的“版本”

时间:2014-04-03 15:22:38

标签: sql liquibase

我们使用Liquibase跨多个MS SQL Server数据库实例进行配置管理。如果所有数据库都执行了所有可用的Liquibase脚本,那么以下是一个可靠的查询来确认所有数据库是否同步?我正在寻找一种方法来从数据库脚本而不是Maven或任何其他命令行实用程序。

select top 1 ID from DATABASECHANGELOG
order by DATEEXECUTED desc

3 个答案:

答案 0 :(得分:1)

这可能适用于非常简单的场景,但如果您的更改日志有任何类型的条件'你将需要更多的逻辑部分。

您真正想知道的是应用于每个数据库的更改集是否相同。由于更改集由id + author标识,因此您应该从DATABASECHANGELOG获取这两列,然后对这些列进行设置比较以查看这些集完全相同。

答案 1 :(得分:1)

我建议标记您的数据库。两种支持的机制:

  1. tagDatabase重构命令,包含在变更集中
  2. 命令行tag选项
  3. 我个人赞成第一个选项,以便将版本控制内置到更改集文件中。当作为应用程序升级过程的一部分执行时,第二个选项很有用(创建回滚标记)。

    最后,一旦标记了数据库,就可以使用SQL检索最新版本:

    SELECT TOP 1 cl.tag
      FROM DATABASECHANGELOG cl
     WHERE cl.tag is not null 
     ORDER BY 1 DESC
    

    显然,这种方法假定您的标记字符串具有数字组件,因此它们按预期排序。

答案 2 :(得分:1)

除了@SteveDonnie提到的条件更改集之外,changeSets执行的顺序可能会有所不同,具体取决于更新更改日志和数据库的方式和时间。例如,如果你有更改集A,B然后开发人员X添加C并且开发人员Y更新D则X的顺序是A,B,C和Y的顺序是A,B,D。当他们将他们的变化合并在一起时,最终的顺序可能是A,B,C,D,当X运行最终版本时,他的订单将是A,B,C,D,但Y的最终订单将是A,B,D,C 。

Y的数据库将完全是最新的,但即使你期待“D”,SELECT TOP 1也会为他返回“C”。它可能会或可能不是您遇到的情况,但是另一个原因是简单的单行选择不会告诉您数据库是否是最新的。

Liquibase确实有一个“status”命令可以对数据库和更改日志运行,它将返回数据库是否是最新的。