Liquibase不会记录约束违规的错误

时间:2018-02-05 15:31:05

标签: liquibase

我正在开发一个spring boot应用程序,我们使用liquibase来跟上数据库的最新状态。 我们有一个场景,我们导入一些JSON数据,这些数据作为varchar保存到SQL Server上的表中。此JSON包含UI配置,有时开发人员在导入数据之前忘记检查JSON是否有效,由于JSON无效导致UI中的错误。

为了防止出现这种错误,我们在数据库级别添加了一个约束,以确保数据只包含有效的JSON,但是当我们运行应用程序时, 使用无效的JSON,没有记录崩溃或错误 - 无提示地忽略SQL错误。

我的liquibase变更集:

<changeSet author="my.name" id="02_my_script" runOnChange="true" failOnError="true" >
    <sqlFile dbms="h2, oracle, mssql" encoding="utf8"
        endDelimiter="\nGO"
        path="classpath:sql/02_my_script.sql"
        relativeToChangelogFile="false" splitStatements="true" stripComments="true"/>

02_my_script.sql - 包含一个包含JSON的sql脚本,类似这样(我不能使用真正的json):

DELETE FROM My_Table WHERE ID = 1;
INSERT INTO My_Table (Json)
VALUES ('{
    "name" : "Test"
    "firstName" : "ABC"
}');

My_Table上的约束:

ALTER TABLE My_Table ADD CONSTRAINT Chk_JSON_is_json CHECK (ISJSON(Json) > 0)

如果我尝试直接在DB上运行脚本,那么我会收到预期的错误。

是否存在我们可以使用的设置,以便在存在约束违规时使liquibase显示错误?或者可能只是将错误记录在日志文件中的配置?

我使用的Liquibase版本是3.5.3

1 个答案:

答案 0 :(得分:0)

Liquibase Jira中报告了与此行为相关的错误。

我在Liquibase源代码中做了一点调试,我在JdbcExecutor.ExecuteStatementCallback#doInStatement方法中找到了一个调用 stmt.execute(声明);并根据java doc

  

执行给定的SQL语句,该语句可能返回多个结果。   在某些(不常见的)情况下,可能会返回单个SQL语句   多个结果集和/或更新计数。通常你可以忽略   除非你是(1)执行你知道的存储过程   返回多个结果或(2)您正在动态执行   未知的SQL字符串。 execute方法执行SQL语句和   表示第一个结果的形式。然后,您必须使用这些方法   getResultSet或getUpdateCount来检索结果,和   getMoreResults移动到任何后续结果。

我认为我处于第二种情况(“执行未知的SQL字符串”),并且没有抛出异常。当我从调试器调用getMoreResults方法时抛出了异常。

我能够通过创建custom liquibase extension解决问题,我使用jackson库验证了json。