表A的触发器更改另一表B,引起他的触发器在更改表A,两个触发器就可以引起“无限深度”的嵌套触发了,肯定会碰到“32层”这个限制。将嵌套深度限制在32层,是一个非常简单实用的防止“无限循环”嵌套的方法。这是SQL Server中一个挺不错的设计。如果你不了解计算机原理,很难给你解释什么是层。计算机软件在执行中必须将当前的环境变量保存在堆栈中,通过“入栈、出栈”动作完成过程调用和返回。这对于学过计算机(程序)原理的人就像“吃饭要用碗”一样普通。

解决方案 »

  1.   

    SQL Server对于某些触发,可以自动检测出“自我触发”的现象,从而仅仅触发一次。比如,你在一个update触发器中update自己所在的表,并不会引发第二次触发器执行。但是,如果你通过其它表或者其它对象经过复杂的过程反过来触发这个触发器代码,那么就很可能引起“无限深度”的触发。
      

  2.   

    我的触发器是for insert型的,当输入一门功课的成绩时,通过储存过程来计算得分,并把次分数填到刚插入的记录的得分列,用的是update语句,我想应该不会出现"死"的.
      

  3.   

    我也遇到这样的情况了,错误提示为:服务器: 消息 8164,级别 16,状态 1,过程 sp_******,行 43
    An INSERT EXEC statement cannot be nested.请大家帮忙!