刚才想到一个触发器的问题,
比如说一个表,如果我想建一个instead of触发器
并且这个触发器是触发这个表本身的,那么如果我在这个触发器中在有更新语句,
这个动作会递归做下去吗?有点想不明白。create trigger tri_test
on TB 
instead of update
as
Begin
declare @i int
select @i=id from inserted
if @i>10
update a set a.qty=20 from TB a,inserted b
where a.id=b.id
else
print N'the value is invalid'
End

解决方案 »

  1.   

    得先将数据库设置为“递归触发器启用”,再试。USE [master]
    GO
    ALTER DATABASE [DBName] SET RECURSIVE_TRIGGERS ON WITH NO_WAIT
    GO
      

  2.   

    自己试试就知道了..
    instead of是代替的意思
    只会认为是你的语句代替执行UPDATE操作..INSTEAD OF触发器不允许递归执行.
      

  3.   

    递归触发器
    如果使用 ALTER DATABASE 启动了 RECURSIVE_TRIGGERS 设置,则 SQL Server 还允许递归调用触发器。递归触发器可以采用下列递归类型: 间接递归在间接递归中,一个应用程序更新了表 T1。 这触发了触发器 TR1,从而更新了表 T2。 在这种情况下,将触发触发器 T2,从而更新 T1。
    直接递归在直接递归中,应用程序更新了表 T1。 这触发了触发器 TR1,从而更新了表 T1。 由于表 T1 被更新,将再次触发触发器 TR1,依此类推。
    以下示例同时使用了间接和直接触发器递归。假设对表 T1 定义了两个更新触发器 TR1 和 TR2。 触发器 TR1 以递归方式更新表 T1。 UPDATE 语句各执行 TR1 和 TR2 一次。 另外,执行 TR1 将触发执行 TR1(递归)和 TR2。 指定触发器的 inserted 和 deleted 表包含仅与调用触发器的 UPDATE 语句对应的行。注意: 
    仅当使用 ALTER DATABASE 启用了 RECURSIVE_TRIGGERS 设置时,才能发生前述行为。 执行为特定事件定义的多个触发器时,并没有确定的执行顺序。 每个触发器都应是自包含的。
     
    禁用 RECURSIVE_TRIGGERS 的设置只能阻止直接递归。 若要同时禁用间接递归,请使用 sp_configure 将 nested triggers 服务器选项设置为 0。
    如果任一触发器执行了 ROLLBACK TRANSACTION 语句,则无论嵌套级是多少,都不会再执行其他触发器。嵌套触发器
    触发器最多可以嵌套 32 级。 如果一个触发器更改了包含另一个触发器的表,则第二个触发器将被触发,然后该触发器又可以调用第三个触发器,依此类推。 如果链中任意一个触发器引发了无限循环,则会超出嵌套级限制,从而导致取消触发器。 若要禁用嵌套触发器,请用 sp_configure 将 nested triggers 选项设置为 0(关闭)。 默认配置允许嵌套触发器。 如果关闭嵌套触发器,则不管使用 ALTER DATABASE 设置的 RECURSIVE_TRIGGERS 设置如何,都将同时禁用递归触发器。