sql - 如何处理触发器中的错误?

标签 sql sql-server error-handling triggers sql-server-2008-r2

我正在编写一些在数据库表中插入行时需要执行的 SQL 代码,因此我使用了 AFTER INSERT 触发器;代码相当复杂,因此仍然可能存在一些错误。

我发现,如果在执行触发器时发生错误,SQL Server 会中止批处理和/或整个事务。这对我来说是 Not Acceptable ,因为它会导致使用数据库的主应用程序出现问题;我也没有该应用程序的源代码,因此我无法对其进行适当的调试。我绝对需要所有数据库操作成功,即使我的触发器失败。

如何编写触发器代码,以便在发生错误时 SQL Server 不会中止 INSERT 操作?

此外,我如何执行正确的错误处理,以便我可以真正知道触发器已失败?发送带有错误数据的电子邮件对我来说没问题(触发器的主要目的实际上是发送电子邮件),但是我如何检测触发器中的错误条件并对其使用react?

编辑:

感谢有关使用触发器以外的其他方法优化性能的提示,但这段代码并不“复杂”,因为它是长时间运行或性能密集型的;它只是构建并发送邮件消息,但为此,它必须从各种链接表中检索数据,并且由于我正在对该应用程序进行逆向工程,因此我没有可用的数据库模式,并且仍在尝试查找我的方法;这就是为什么转换错误或意外/空值仍然会蔓延,使触发器执行崩溃的原因。

另外,如上所述,我绝对不能对应用程序本身进行调试 ,也没有修改它来做我在应用层需要的东西;对应用程序事件使用react的唯一方法是在应用程序向数据库写入刚刚发生的事情时触发数据库触发器。

最佳答案

如果触发器中的操作很复杂和/或可能长时间运行,并且您不希望事件影响原始事务,那么您需要找到一种方法来解耦事件。

一种方法可能是使用 Service Broker .在触发器中,只需创建消息(每行一个)并在途中发送它们,然后在服务中进行其余的处理。

如果这看起来太复杂,那么旧的方法是将需要处理的行插入到工作/队列表中,然后让工作不断从那里提取行来完成工作。

无论哪种方式,您现在都不会阻止原始事务提交。

关于sql - 如何处理触发器中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10462800/

相关文章:

sql - 更改 SQL Server 函数以接受新的可选参数

sql - 可以在 PostgreSQL IN 子句中包含集合吗?

mysql - Phpmyadmin 没有选择正确的值

sql-server - SQL Server 索引(避免连接上的聚集索引扫描)

sql-server - 为什么 Azure 在时间点还原期间需要源 SQL 实例的写入权限?

sql-server - SQL Server触发器切换Insert、Delete、Update

c# - 无法使 httpErrors 工作

mysql - 如何对包含逗号分隔值的列进行查询

c# - 我应该扔/期望扔什么?

validation - 如何编写Grails验证消息?