当前位置: 代码迷 >> Sql Server >> 触发器招致死循环 报错
  详细解决方案

触发器招致死循环 报错

热度:84   发布时间:2016-04-24 10:14:53.0
触发器导致死循环 报错
两个触发器 
ALTER trigger [dbo].[二手车更新_修改更新时间]
on [dbo].[二手车出售]
after update 
as 

begin
  
 if COLUMNS_UPDATED()<>0x000000000000C000000000000000 and COLUMNS_UPDATED()<>0x0000000000040000000000000000
  begin
  print COLUMNS_UPDATED()
   --update 二手车出售 set  修改时间=GETDATE()
   --   from 二手车出售 b with(nolock),Deleted d,Inserted i
   --   where b.编号=i.编号
  end 

  print COLUMNS_UPDATED()
end






ALTER trigger [dbo].[已售]
on [dbo].[二手车出售]
after update 
as 
begin

DECLARE @已售 nvarchar;

select @已售=已售 from inserted;
  
  if(@已售='是')
  begin
  update 二手车出售 set 已售1=0
      from 二手车出售 b with(nolock),Deleted d,Inserted i
      where b.编号=i.编号
  end 
  
else if(@已售='否')
  begin
  update 二手车出售 set 已售1=1
      from 二手车出售 b with(nolock),Deleted d,Inserted i
      where b.编号=i.编号
  end 

end




现在 执行第二个触发器会调用第一个,第一个执行完又去调用第二个,有什么办法让他们不互相调用吗
------解决方案--------------------
先问下自己为什么要这么玩.
------解决方案--------------------
第一个执行完又去调用第二个
--> 没发现第一个触发器里有update语句(已注释掉)喔? 何来触发第二个触发器?
------解决方案--------------------
 ---把第一个update语句放到第二个里面不是更好,第一个触发器可以不建
ALTER trigger [dbo].[已售]
on [dbo].[二手车出售]
after update 
as 
begin
 
DECLARE @已售 nvarchar;
 
select @已售=已售 from inserted;
   
  if(@已售='是')
  begin
  
   update 二手车出售 set 已售1=0
      from 二手车出售 b with(nolock),Deleted d,Inserted i
      where b.编号=i.编号
  
  end 
   
else if(@已售='否')
  begin
  update 二手车出售 set 已售1=1
      from 二手车出售 b with(nolock),Deleted d,Inserted i
      where b.编号=i.编号
      
   update 二手车出售 set  修改时间=GETDATE()
      from 二手车出售 b with(nolock),Deleted d,Inserted i
      where b.编号=i.编号
 
  end 
  
  end
 
  相关解决方案