总是运行带有 failOnError="false" 的 Liquibase changeSet?

Posted

技术标签:

【中文标题】总是运行带有 failOnError="false" 的 Liquibase changeSet?【英文标题】:Liquibase changeSet with failOnError="false" are always ran? 【发布时间】:2012-06-10 09:43:06 【问题描述】:

我正在尝试在 liquibase 中执行以下changeSet,它应该会创建一个索引。如果索引不存在,它应该静默失败:

<changeSet failOnError="false" author="sys" id="1">
    <createIndex unique="true"  indexName="key1" tableName="Table1">
        <column name="name" />
    </createIndex>
</changeSet>

到目前为止,一切都很好。问题是,这个changeSet 没有登录到 DATABASECHANGELOG 表中,因此每次 liquibase 运行时都会执行。根据 liquibase 文档,例如this answer 来自 Nathen Voxland 我认为变更集应该在 DATABASECHANGELOG 表中标记为已运行。相反,它根本没有记录,正如我之前所说的,每次 liquibase 运行时都会执行(并且每次都失败)。

我错过了什么吗?

(我使用 mysql 作为 DBMS)

【问题讨论】:

【参考方案1】:

在 Nathen Voxland 给出的 answer 中,他推荐了更正确的方法,即在运行变更集之前使用 precondition 检查数据库的状态。

在我看来,忽略失败是个坏主意....意味着您不能完全控制数据库配置....“failOnError”参数允许 liquibase 继续。如果实际上由于发生错误而没有记录更改集,那么构建记录是否已执行不是一个坏主意吗?

【讨论】:

我完全支持你,我认为使用前提条件也是正确的方法。毕竟,这就是我对changeSet 所做的事情(尽管缺少 uniqueConstraintExists 前提条件,但这是另一个事实)。我只是偶然发现了我对 failOnError="false" 属性的期望,我问自己所描述的行为是错误还是功能;) 不幸的是,Oracle 非空的前提条件对我不起作用,因为 liquibase 不支持检查不可空列。 我代表dev-null 发布此评论作为答案; 这与前面答案中 st_jeff 的评论有关(但我没有 50 名声望发表评论):failOnError 的另一个用例:如果您在 oracle 中删除唯一约束,则相关索引只会被删除如果它比约束更新。因此,删除约束后的删除索引语句可能会导致错误,具体取决于索引的年龄。

以上是关于总是运行带有 failOnError="false" 的 Liquibase changeSet?的主要内容,如果未能解决你的问题,请参考以下文章

带有“if”的while循环无法正常工作

在带有协议升级的 nginx 反向代理后面运行 daphne 总是路由到 http 而不是 websocket

带有 Distriqt Compass 的 Adob​​e Flash Professional CS5.5(AS3) 总是说“无法创建本机扩展上下文”

mybatis中mapper运行总是报错connection timed out :connect

cmd中运行java程序总是出现Exception in thread "main" java.lang.NoClassDefFoundError,怎么办?

简单C语言,程序显示没错误,但是总是运行不出来,为啥呢?