我正在开发一个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
答案 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。