【问题标题】:Handle error in SQL Trigger without failing transaction?在不失败事务的情况下处理 SQL 触发器中的错误?
【发布时间】:2009-06-09 14:04:59
【问题描述】:

我觉得这可能是不可能的,但是这里......

我有一个表,上面有一个插入触发器。当数据被插入到这个表中时,触发器会触发并解析一个长的 varbinary 列。此触发器对二进制数据执行一些操作,并将多个条目写入第二个表。

我最近发现的是,有时二进制数据不是“正确的”(即它不符合应有的规范 - 我无法控制),这可能会导致转换错误等。

我最初的反应是将事物包装在 TRY/CATCH 块中,但这似乎也不是解决方案,因为 CATCH 的执行意味着事务注定要失败,并且我收到“触发器中的事务注定要失败”错误。

当务之急是数据仍被写入初始表。我不在乎数据是否被写入第二个表。

我不确定我是否能做到这一点,如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: sql transactions triggers


    【解决方案1】:

    您可以做的是在触发器内提交事务,然后执行这些转换。 不过,我不知道这是否可以解决您的问题。

    另一种选择是创建一个函数 IsYourBinaryValueOK 来检查列值。但是检查必须使用 like 来完成,以免导致错误。

    【讨论】:

    • 是的,这个想法很有效——一个检查每个字符的小功能,看看它是否在“1”、“2”、“3”等中——如果在任何时候不是这样的话”将返回 0 否则它将返回强制转换的结果。似乎做得很好!
    • @Valerion - 您可能还想查看 IsNumeric() 函数,但它可能对您的需求过于宽松。
    【解决方案2】:

    听起来这段代码不应该在插入触发器中运行,因为它在概念上是两个不同的事务。使用异步处理(例如服务代理、寻找“未完成”工作的后台保姆任务等)可能会更好。您也可以通过使用存储过程在一个事务中进行插入然后让它调用来处理它之后的做其他工作代码。

    如果您绝对必须在触发器中执行此操作,那么您基本上需要一个自主事务。对于一些想法,请参阅this link(这些技术也适用于 sql 2005)。

    【讨论】:

    • 良好的链接和有趣的阅读,虽然我已经选择了其他答案。同意事后看来,触发器可能不是最好的,但它在概念上确实更适合系统的其余部分,并且更易于管理。最后,通过使用一个函数,我实际上避免了首先引发的错误,我认为这比尝试解决它更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多