【问题标题】:how to know the liquibase changesets are safe enough to run on a database如何知道 liquibase 变更集是否足够安全以在数据库上运行
【发布时间】:2018-11-03 08:59:33
【问题描述】:

我正在尝试开发一个 Web 应用程序,它可以根据用户选择的应用程序版本升级用户的数据库。我正在使用 liquibase api 来执行此操作。每个版本都有一组 liquibase 变更集文件。我想确保要在用户数据库上运行的变更集是安全的。有没有办法在不影响数据库的情况下验证用户数据库的变更集,然后更新 liquibase 文件?我的变更集没有“回滚”标签。

【问题讨论】:

标签: database upgrade liquibase


【解决方案1】:

您可以使用preConditions。 除了内置的前置条件(其中有很多)之外,还有一个sqlCheck,可让您检查您想要的任何条件。您可以检查sqlCheck 前置条件中可能存在的错误和不一致。

<changeSet id="changesetId" author="changesetAuthor">
        <preConditions onFail="MARK_RAN">
            <sqlCheck expectedResult="">
                <!-- your SQL here -->
            </sqlCheck>
        </preConditions>
        <!-- the rest of the changeSet -->

查看 preConditions 的 liquibase 文档。

【讨论】:

  • tnx for d 回复。我正在处理大量的变更集。我想避免编辑它们。dis 上下文中的“安全”意味着版本的变更集应该完全执行或根本不执行但不是部分执行。升级过程是连续的,中间的错误会停止该过程使用户的数据库不完整。有没有办法事先知道错误?我尝试在发生错误时回滚事务管理,但 ddl 语句正在强制隐式提交。
  • 好吧,如果用户已经有一个数据库,那么这个数据库已经滚动了变更集,并且这个数据库在databasechangelog表中有相应的记录,所以它们不会被再次执行。所以你需要新的 changeSets 来改变现有的数据库,不是吗?所以sqlCheck 可以做到这一点。还是我错过了什么?
  • 是的,我绝对可以使用 databasechangelog 表从我离开的地方继续。这正是我们现有升级应用程序的工作方式。我现在正在开发的应用程序需要在将更改应用于用户数据库之前执行验证。以下示例可能有助于更好地理解。用户版本:1.0 - 可用升级版本:4.0。要升级,应用程序必须运行 2.0 ,3.0,4.0 中的所有集合。假设 3.0 中的第 7 个集合发生错误,那么应用程序应该生成 db 2.0 而不是 2.0 和 6 组 3.0。
  • 变更集是健壮的(无需更改)。如果发生任何可能来自用户数据库的错误。
  • 现在这有点棘手。我觉得这超出了我的专业范围,抱歉。唯一想到的是以某种方式将版本 2,3 和 4 中的变更集包装到一个大变更集中,或者尝试使用事务管理器,捕获异常并手动回滚更改
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 2023-03-15
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多