在没有失败事务的情况下处理SQL触发器中的错误?
问题描述:
我有一种感觉,这可能是不可能的,但这里去...在没有失败事务的情况下处理SQL触发器中的错误?
我有一个表上有一个插入触发器。当数据插入到此表中时,触发器将触发并解析长varbinary列。该触发器对二进制数据执行一些操作,并将几个条目写入第二个表中。
我最近发现的是,有时二进制数据不是“正确的”(即它不符合它应该的规范 - 我无法控制这个),这可能会导致铸造错误等。
我最初的反应是将事情封装在TRY/CATCH块中,但它似乎也不是解决方案,因为CATCH的执行意味着事务注定失败,并且我得到一个“事务注入触发器”错误。
什么是无用的是,数据仍然写入初始表。我不在乎数据是否写入第二个表格。
我不知道我是否可以完成这个或没有,并会感激地收到任何建议。
答
你可以做的是在触发器内提交一个事务,然后执行这些强制转换。 我不知道这是否可以解决您的问题。
另一个选择是创建一个函数IsYourBinaryValueOK,它将检查列值。然而,检查必须完成,以避免发生错误。
答
听起来这样的代码应该在插入触发器中运行,因为它在概念上是两个不同的事务。您可能会更好地使用异步处理,如服务代理,寻找“未完成”工作的背景保姆任务等。您还可以通过使用sproc在一个事务中执行插入操作,然后让它调用之后的其他工作代码。
如果你绝对必须在触发器中这样做,那么你基本上需要一个自主事务。对于一些想法,请参阅this link(这些技术也适用于SQL 2005)。
值得一试,感谢您的想法。 – Valerion 2009-06-09 14:53:02
是的,这个想法工作得很好 - 一个小函数来检查每个字符,看它是否在'1','2','3'等等 - 如果在任何时候它不会返回0否则它会返回演员的结果。似乎很好地完成了这项工作! – Valerion 2009-06-09 15:36:43