具体问题就是,我再触发器过程中实现调用了存储过程,然后存储过程做了一些insert delete操作,如果在存储执行过程中
触发器被再次触发,那么存储过程是会停止还是继续执行呢?

解决方案 »

  1.   

    在SQL2000中默认不会递归触发,可以用这个函数看一下是否默认为递归触发:
    select DATABASEPROPERTYEX('Test','IsRecursiveTriggersEnabled')
    如果是1 则 是(但最大嵌套触发32层)
    如果是0 则 不是
      

  2.   

    --禁用递归就行了:
    exec sp_configure 'nested triggers',0exec sp_dboption '库名','recursive triggers',false
      

  3.   

    我执行那个后是NULL,再有我感觉这个问题是触发器执行过程中的并发,而递归是这个触发器引起下一个触发器的执行!
      

  4.   

    不是的,一个insert触发器,第一次数据插入,执行代码,再执行过程中,第2次数据又插入。。并不是第一次的执行导致的第2次触发器的触发!
      

  5.   

    是递归触发的吧:
    测试代码:
    --------------------if(OBJECT_ID('tproc') IS NOT NULL) drop proc tproc
    if(OBJECT_ID('tg') IS NOT NULL) drop trigger tg
    if(OBJECT_ID('tb_test') IS NOT NULL) drop table tb_test
    GO
    create table tb_test(name nvarchar(100))
    GO
    CREATE proc tproc
    as
    insert into tb_test values (convert(nvarchar(50),GETDATE()))
    GO
    create trigger tg on tb_test
    for insert
    as
    exec tproc
    GO--允许递归触发
    alter database test
    set RECURSIVE_TRIGGERS ONinsert into tb_test values ('he')执行结果:

    消息 217,级别 16,状态 1,过程 tproc,第 3 行
    超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。

      

  6.   

    触发器的递归,如果自己不控制,@@nestlevel如果达到32后,sql server会自动终止递归的执行
      

  7.   

    参看《SQL Server 2000技术内幕》P594、P682。