【问题标题】:Can liquibase syntactically validate the SQL generated using updateSql command?liquibase 可以在语法上验证使用 updateSql 命令生成的 SQL 吗?
【发布时间】:2014-09-02 07:18:23
【问题描述】:

我在 Liquibase 中运行 updateSQL 命令行时发现了 2 个问题

  1. 当通过 sqlplus 命令行运行 sql 时,Liquibase updateSQL 输出中的最后一条语句(即插入 DBCHANGELOG 表)不会自动提交

    因此,虽然变更集被执行,但 DBCHANGELOG 表没有插入语句来记录它。因此,当我再次运行 updateSQL 时,最后一个变更集再次在 SQL 输出中创建,这是不正确的。

  2. Liquibase 不会验证/检查 SQL 中的语法错误。

    因此,即使变更集 SQL 失败,对变更集的 DBChangeLog 表的插入也会成功,这是不正确的。如果变更集 SQL 实际失败,是否有办法使变更集后面的插入语句停止/失败?

非常感谢任何帮助...我们离实现 Liquibase 已经如此接近了...!!

【问题讨论】:

标签: sql database oracle liquibase


【解决方案1】:

要回答主题行中的问题,不,Liquibase 无法验证 SQL。 Liquibase 支持许多不同的数据库,每个数据库都有不同的 SQL 语法。

如果可以,请停止使用 updateSQL 生成的 SQL 来实际执行更新,并使用 Liquibase 本身来执行更新。这样,Liquibase 就可以检测到错误并且表现得更正确。我建议如果 DBA 害怕 Liquibase 接触数据库,那么团队使用 generateSQL 作为预检查,看看 Liquibase 会做什么,但让 Liquibase 完成它的工作。

【讨论】:

    【解决方案2】:

    我还发现 Liquibase 的最佳实践不是使用 SQL 脚本,而是手动编写 Liquibase XML 文件以进行更改。

    我尝试使用 ExecuteCommand 标签来午餐 sqlplus 或 sqlcmd(我知道我的目标数据库),它有一个 bug,现在它已经关闭了?! (但这是开源的,所以我不能抱怨:))

    话虽如此,我发现使用 XML 来指定更改会带来许多其他挑战,例如: 1. 确保 每个 更改都包含在更改日志 xml 文件中。我听说许多组织忘记将文件添加到变更日志中。 2. 确保特定更改的文件始终与基于文件的版本控制同步。想象一下,如果不这样做会发生什么——这发生在我的许多客户身上…… 3. 浪费时间在不同环境(分支、UAT - 关键修复、沙盒等...)之间合并变更日志

    【讨论】:

    • 我的观点是,使用 Liquibase 的最佳实践 - XML 文件,我发现自己和我的团队花费大量时间在同一对象的不同环境(并行工作)中生成的变更日志之间进行同步,并且我们得到了积分时间的冲突。因此,我们节省了时间,但另一方面我们在集成时间上有开销。
    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 2015-04-24
    • 2013-04-27
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多