【问题标题】:Stringe timeout trigger error字符串超时触发错误
【发布时间】:2017-04-14 12:37:48
【问题描述】:

我在 sql server 数据库中有一个触发器,行为非常奇怪,这些是奇怪的指令:

...
EXEC  [ope].[spMissionDepartment] @AircraftId = @vnAircraftId

RAISERROR('test error', 16, 1)

END TRY 
BEGIN CATCH
    SELECT @ErrorMessage = ERROR_MESSAGE()

    ROLLBACK TRANSACTION

    RAISERROR(@ErrorMessage, 16, 1) -- strange line

END CATCH

奇怪的行为是这样的:
如果我删除 strange line 而不是在网页中收到错误

超时。在操作完成或服务器没有响应之前已经过去了超时时间。

否则,如果我删除奇怪的行,我会收到错误

测试错误

没有其他触发器,所以 exec 应该是最后执行的语句,我怎么可能只收到一个 Timeout 而没有 Raiserror

【问题讨论】:

  • 在奇怪的行试试这个`RAISERROR(@ErrorMessage, 9, 1)`
  • 但是如果我使用 9 作为严重性它将继续,所以就像没有 Raiserror,奇怪的行为是 Raiserror 应该是最后一条执行的语句,为什么后面会有超时?
  • 也许这可以帮助你sqlhints.com/2013/06/30/…
  • 我读了这篇文章,但是我有一个try catch,所以执行不会继续,这是正确的,奇怪的是我只收到一个超时而没有Raiserror i> 但它之后什么都没有。那么超时发生了什么?
  • 如果添加一个带有另一个测试错误的 FINALLY 块会发生什么?

标签: sql-server database-trigger timeoutexception raiserror


【解决方案1】:

不受 TRY…CATCH 构造影响的错误 TRY...CATCH 构造不会捕获以下条件:

  1. 严重性为 10 或更低的警告或信息性消息。
  2. 严重性为 20 或更高的错误会停止会话的 SQL Server 数据库引擎任务处理。如果发生严重程度为 20 或更高的错误并且数据库连接未中断,则 TRY...CATCH 将处理该错误。
  3. 注意事项,例如客户端中断请求或客户端连接中断。
  4. 当系统管理员使用 KILL 语句结束会话时。

当以下类型的错误发生在与 TRY…CATCH 构造相同的执行级别时,CATCH 块不会处理它们:

  1. 编译错误,例如语法错误,阻止批处理运行。
  2. 语句级重新编译期间发生的错误,例如由于延迟名称解析而在编译后发生的对象名称解析错误。

【讨论】:

  • 这有什么帮助?您是否建议他收到一个不会导致 CATCH 块执行的错误?如果是这样,那为什么在 CATCH 块中删除一行会改变行为?
  • 再做一件事,只是在sql studio中手动执行proc,并在每一步中放入打印语句。然后找出需要时间的语句...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2018-04-06
  • 2015-10-18
  • 2014-03-14
  • 1970-01-01
相关资源
最近更新 更多