建议在管理多个数据库时记录一个数据库中的所有liquibase变更集?

时间:2014-03-05 23:06:59

标签: liquibase

我正在使用一个现有的应用程序,它有两个不同的数据库,以及一堆预先存在的SQL语句。数据库是:

  1. 应用
  2. 登录
  3. 它们不共享架构,但它们都在应用程序运行时使用。

    问题:在其中一个数据库下记录所有变更集是否可取,首选或不赞成?

    这是一些背景知识。当我第一次开始针对这些测试liquibase时,我试图在运行时选择数据库并遇到错误,此外,它正在系统数据库中记录变更集。

    SQL语句都捆绑在几个文件中,因此我开始按数据库拆分它们,并在每次看到新的--changeset

    时插入USE [foo]个条目

    一切都很好看,我这就是我不得不去做的事情。这给了我一个每个数据库的更改日志,这可能是你开始干净的理想选择。

    但是,我不小心错过了Logging数据库中将记录插入App数据库的声明;所以,我在两个数据库中都有重复的插入语句,但插入显式地说:

    INSERT INTO [app].[dbo].[tableA] values ('1', 'one')
    

    因此,当我对两个数据库运行更新时,它成功用于App但在登录时失败。有趣的是,如果我在Logging下首先放入DELETE,它就会成功,尽管URL指向了Logging数据库。

    让我感到有些惊讶,但现在让我想知道我是否只能在URL中列出Logging数据库并将所有更改保留在一起;应用程序更改集和记录更改集将仅记录日志数据库。

    我知道这可以防止将它们分开,但考虑到所有SQL语句已经混合,似乎在开始时实现起来要容易得多。

1 个答案:

答案 0 :(得分:0)

我会说答案是“它取决于”。我的一般建议是,每个应用程序应该使用一个databasechangelog,尽管如果你有很多独立的模块,通常可以通过模块进行分解。但是,模块需要完全独立,没有跨对象引用。

在您的情况下,听起来您有单独的独立模块,但除非您有充分的理由,它可能最简单且不易出错,仍然只有一个databasechangelog表来管理已应用于两个模式/数据库的内容。这只是模块化与简单性之间的权衡。

使用单个changelog文件和databasechangelog表,您可以在大多数操作中使用“catalogName”attribue来指定应该更改的数据库。

Liquibase仅使用一个连接,因此使用单个changelog表将只允许您运行liquibase一次,但您连接的用户将需要两个数据库的权限。

相关问题