Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Liquibase不支持SQL server的错误_Sql Server_Liquibase - Fatal编程技术网

Sql server Liquibase不支持SQL server的错误

Sql server Liquibase不支持SQL server的错误,sql-server,liquibase,Sql Server,Liquibase,我们有许多配置脚本,它们有点复杂。这些脚本使用数据库中的许多可用存储过程来插入配置数据。如果任何脚本试图插入无效数据,存储过程将调用 RAISERROR @msg, 16, 1 然后SP将返回。SP启动自己的命名事务,并回滚/提交命名事务。但是,LB未检测到引发的错误,它将执行视为成功执行。但如果这种情况发生,我们不想继续 变更集中的FailOneError设置为true,但LB仍在继续。甚至在DATABASECHANGELOG中,失败的变更集被标记为已执行,就好像它成功了一样 我们还尝试删除

我们有许多配置脚本,它们有点复杂。这些脚本使用数据库中的许多可用存储过程来插入配置数据。如果任何脚本试图插入无效数据,存储过程将调用

RAISERROR @msg, 16, 1
然后SP将返回。SP启动自己的命名事务,并回滚/提交命名事务。但是,LB未检测到引发的错误,它将执行视为成功执行。但如果这种情况发生,我们不想继续

变更集中的FailOneError设置为true,但LB仍在继续。甚至在DATABASECHANGELOG中,失败的变更集被标记为已执行,就好像它成功了一样

我们还尝试删除名为transactions的嵌套事务,但没有成功

我们从事务中删除了名称,仅使用BEGIN TRAN,LB执行会在错误的脚本处停止,但问题是,LB无法提交自己的事务,无法释放锁,因此它仍然处于锁定状态

是否有必要告诉LB发生了错误并使其停止

我们正在使用Liquibase 3.5.0。和Microsoft SQL Server

==编辑

所以在调试Liquibase之后,我们发现了两件事:

当连接到MS SQL Server时,如果发生RAISERROR并且脚本中还有ResultSet,则除非调用statement.getMoreResults,否则它不会引发异常。同样的事情也发生在Sybase上,我们也用Sybase进行了测试。所以我们认为在LB中,在执行语句之后,我们需要调用getMoreResults,直到它抛出exception或返回false,这意味着没有发生错误

脚本调用存储过程。存储过程有“BEGIN-TRAN”,最后是COMMIT或ROLLBACK。如果发生回滚,也不会出现错误。请注意,我们的脚本不进行任何更新/插入,它们只提供临时表中的数据,因此我们不在脚本中进行事务处理。在这种情况下,考虑添加代码来调用GeMeReRESULTS,异常被正确地抛出,然后在LB中,执行器尝试数据库。回滚,然后再次在标准锁服务中,在释放锁之前,它尝试数据库。回滚结束,因为我们的SP已经回滚了事务。LB中的最后一次回滚导致JDBC引发的错误被吞没,因此,我们不仅看到导致它的错误,而且锁仍然未释放,这是最令人担忧的,因为即使我们重新运行脚本并修复它,锁也没有被释放,我们需要手动执行


有人可能会说我们的事务处理是不正确的,但我想说的是,如果我们的脚本不正确,释放锁不应该受到影响。如果脚本/变更集未成功运行,LB应该释放锁并引发异常或继续。如果有人也面临此问题:在我的情况下,我只有一个非常复杂的用于MS SQL Server的SQL脚本。如果SQL脚本中发生错误,这也无法停止LB更改的执行,如果我使用RAISERROR或THROW。 我需要做的事情,让它工作:

删除或注释创建结果集的所有位置选择 启动SQL脚本,并启用SET NOCOUNT;避免因 插入或更新。。。受影响的线路 在SET NOCOUNT关闭的情况下结束SQL脚本;要使LB在执行SQL脚本集EXECTYPE后正常工作,请执行以下操作 使用前提条件


创建另一个变更集,并在继续下一步之前检查执行结果。

我在只执行少量插入的非常简单的脚本中也注意到了这一点。我的解决方案是用分批分离器将每个插入物分开。我使用的是Liquibase格式的sql。据我所知,Liquibase使用JDBC连接到数据库。您手头是否有一个也使用JDBC驱动程序的DB工具?您可以手动运行liquibase将执行的SQL语句,看看会发生什么。可能错误没有返回给调用SP的sql语句?因此没有通过JDBC向调用代码报告?我对SQL Server dbs一无所知。这只是一个提示,告诉你如何缩小这个原因…@PeterHenell我们的脚本不是LB格式的。他们中的很多人都是从遗留系统中转移过来的。它们可以做很多事情,例如插入记录,检查依赖项以确保没有插入无效数据,等等@Jens我没有使用JDBC工具运行它们,但是如果您在Salford server studio中运行相同的脚本,它会在发生错误时以红色打印日志。当我回来工作时,我将尝试使用JDBC。如果您使用的是SQL Server 2012或更高版本,您可以尝试THROW命令,这是批处理中止,而RAISERROR不是。否则,您可能需要捕获并检查从SQL Server返回的消息。这些通常只是打印语句,但依赖于 g在驱动程序/连接设置上,错误可以被视为消息。在这种情况下,您需要捕获消息并检查它们的状态/严重性/级别,以查看它们是错误还是信息。