嵌套触发器和触发器递归:
默认情况下,Adaptive Server 允许嵌套触发器。要防止触发器嵌套,请使用 sp_configure 将允许嵌套触发器选项设置为 0(关闭):
sp_configure "allow nested triggers", 0
触发器可以嵌套到 16 级深度。如果触发器更改了另一个触发器所在的表,则第二个触发器将触发,然后可以调用第三个触发器,依此类推。如果链中的任何触发器引发无限循环,则超过嵌套级别并且触发器中止,回滚包含触发器查询的事务。
注意:由于触发器被放入事务中,因此嵌套触发器集的任何级别的失败都会取消整个事务:所有数据修改都会回滚。为您的触发器提供消息和其他错误处理和调试帮助,以确定故障发生的位置。
全局变量@@nestlevel 包含当前执行的嵌套级别。每次存储过程或触发器调用另一个存储过程或触发器时,嵌套级别都会递增。创建缓存语句时,嵌套级别也会加一。如果超过最大值 16,则事务中止。
如果触发器调用的存储过程执行的操作会导致触发器再次触发,则仅在启用嵌套触发器时才会重新激活触发器。除非触发器中有限制递归次数的条件,否则这会导致嵌套级溢出。
例如,如果更新触发器调用执行更新的存储过程,则如果禁用允许嵌套触发器,则触发器和存储过程将执行一次。如果启用了允许嵌套触发器,并且更新次数不受触发器或过程中的条件限制,则过程或触发器循环将继续,直到超过 16 级最大嵌套值。
默认情况下,触发器不会调用自身来响应触发器内对同一表的第二次数据修改,无论允许嵌套触发器配置参数的设置如何。设置选项 self_recursion 使触发器能够作为触发器内的数据修改的结果再次触发。例如,如果表的一列上的更新触发器导致对另一列的更新,则更新触发器仅在 self_recursion 禁用时触发一次,但如果 self_recursion 设置为 on,它最多可以触发 16 次。为了进行自递归,还必须启用允许嵌套触发器配置参数。