处理SQL触发器中的错误而不会导致事务失败?

时间:2009-06-09 14:04:59

标签: sql transactions triggers

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

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

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

我最初的反应是将事物包装在TRY / CATCH块中,但看起来这也不是一个解决方案,因为执行CATCH意味着事务注定失败并且我得到一个“触发事件注定触发器”错误。 / p>

什么是不完美的是数据仍然被写入初始表。我不在乎数据是否写入第二个表。

我不确定我能不能做到这一点,并且不胜感激地接受任何建议。

2 个答案:

答案 0 :(得分:1)

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

另一种选择是创建一个函数IsYourBinaryValueOK来检查列值。但是必须进行检查,以免造成错误。

答案 1 :(得分:1)

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

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