代码之家  ›  专栏  ›  技术社区  ›  Valerion

在事务不失败的情况下处理SQL触发器中的错误?

  •  0
  • Valerion  · 技术社区  · 17 年前

    我觉得这是不可能的,但现在…

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

    我最近发现,有时二进制数据是不“正确的”(即它不符合它应该遵循的规范——我对此没有任何控制),这可能导致转换错误等。

    我最初的反应是用try/catch块包装东西,但似乎这也不是一个解决方案,因为catch的执行意味着该事务将失败,并且我会得到一个“transaction domed in trigger”错误。

    不可预见的是数据仍然被写入初始表。我不在乎数据是否写入第二个表。

    我不确定我是否能做到这一点,我会感激地接受任何建议。

    2 回复  |  直到 17 年前
        1
  •  1
  •   Mladen Prajdic    17 年前

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

    另一个选项是创建一个函数isyourBinaryValueOK,它将检查列值。但是,必须使用like进行检查,以免导致错误。

        2
  •  1
  •   ahains    17 年前

    听起来这段代码不应该在insert触发器中运行,因为它在概念上是两个不同的事务。您最好使用异步处理,例如ServiceBroker,一个查找“未完成”工作的后台保姆任务,等等。您也可以使用存储过程在一个事务中执行插入操作,然后让它调用Do Other工作代码来处理它。

    如果您必须在触发器中执行该操作,那么您基本上需要一个自治事务。有关一些想法,请参见 this link (这些技术也适用于SQL 2005)。