我们使用Liquibase跨多个MS SQL Server数据库实例进行配置管理。如果所有数据库都执行了所有可用的Liquibase脚本,那么以下是一个可靠的查询来确认所有数据库是否同步?我正在寻找一种方法来从数据库脚本而不是Maven或任何其他命令行实用程序。
select top 1 ID from DATABASECHANGELOG
order by DATEEXECUTED desc
答案 0 :(得分:1)
这可能适用于非常简单的场景,但如果您的更改日志有任何类型的条件'你将需要更多的逻辑部分。
您真正想知道的是应用于每个数据库的更改集是否相同。由于更改集由id + author标识,因此您应该从DATABASECHANGELOG获取这两列,然后对这些列进行设置比较以查看这些集完全相同。
答案 1 :(得分:1)
我建议标记您的数据库。两种支持的机制:
我个人赞成第一个选项,以便将版本控制内置到更改集文件中。当作为应用程序升级过程的一部分执行时,第二个选项很有用(创建回滚标记)。
最后,一旦标记了数据库,就可以使用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”命令可以对数据库和更改日志运行,它将返回数据库是否是最新的。