日期:2014-05-18  浏览次数:20515 次

SQL触发器问题,急~~~~~可行的马上结帐
各位,小弟写了个触发器.但在更新时出现以下问题:[Microsoft]]ODBC   SQL   Server   Driver][SQL   Server]超出了存储过程,函数,触发器或试图的最大嵌套层数(最大层数为32)

CREATE   TRIGGER   [Tri_TFWupdate]   ON   [dbo].[Tfangwuinfo]  
FOR   UPDATE
AS
begin
declare   @shouchu   bit   select   @shouchu=Tfangwuinfo.shouchu   from   Tfangwuinfo
if   update   (shouchu)  
if   (@shouchu=0)
insert   Tyezhuinfo(yezhuID,yezhuname)   select   fangwuID,chanquanren   from   inserted   i
if   update   (chanquanren)
update   Tyezhuinfo   set   yezhuname=i.chanquanren   from   inserted   i   where   Tyezhuinfo.yezhuID=i.fangwuID
end

看明白的朋友就看,不明白的只要告诉我如何在if   update(shouchu)中再嵌套一个if的判断语句就行了.

------解决方案--------------------
CREATE TRIGGER [Tri_TFWupdate] ON [dbo].[Tfangwuinfo]
FOR UPDATE
AS
begin
declare @shouchu bit
select @shouchu=shouchu from Tfangwuinfo

if (update (shouchu) and @shouchu=0) --- & 换成 and
insert Tyezhuinfo(yezhuID,yezhuname) select fangwuID,chanquanren from inserted i

if update (chanquanren)
update Tyezhuinfo set yezhuname=i.chanquanren from inserted i where Tyezhuinfo.yezhuID=i.fangwuID
end

------解决方案--------------------
CREATE TRIGGER [Tri_TFWupdate] ON [dbo].[Tfangwuinfo]
FOR UPDATE
AS
begin
/*
declare @shouchu bit
select top 1 @shouchu=Tfangwuinfo.shouchu from Tfangwuinfo
*/
--这里是不是想如果shouchu=0才更新,可为什么是从Tfangwuinfo中取呢?
if (update(shouchu) and exists(select 1 from inserted i,deleted d where i.fangwuID=d.fangwuID and isnull(i.shouchu,0) <> isnull(d.shouchu,0) and i.shouchu=0))
insert Tyezhuinfo(yezhuID,yezhuname)
select i.fangwuID,i.chanquanren
from inserted i,deleted d
where i.fangwuID=d.fangwuID and isnull(i.shouchu,0) <> isnull(d.shouchu,0) and i.shouchu=0
if update (chanquanren) and exists(select 1 from inserted i,deleted d where i.fangwuID=d.fangwuID and isnull(i.chanquanren, ' ') <> isnull(d.chanquanren, ' '))
update Tyezhuinfo
set yezhuname=i.chanquanren
from inserted i,deleted d
where Tyezhuinfo.yezhuID=i.fangwuID
and i.fangwuID=d.fangwuID and isnull(i.chanquanren, ' ') <> isnull(d.chanquanren, ' ')
and Tyezhuinfo.yezhuname <> i.chanquanren
end
------解决方案--------------------
--禁止递归就行了.请在查询分析器运行下面语句禁止递归--
EXEC sp_dboption '数据库名 ', 'recursive triggers ', 'OFF '

exec sp_configure 'nested triggers ',0
reconfigure

------解决方案--------------------
当然也可以在触发器里自己加条件防止递归超过32层

CREATE TRIGGER [Tri_TFWupdate] ON [dbo].[Tfangwuinfo]
FOR UPDATE
AS
begin
declare @shouchu bit select @shouchu=Tfangwuinfo.shouchu from Tfangwuinfo
if (update(shouchu) and @shouchu=0)
insert Tyezhuinfo(yezhuID,yezhuname) select fangwuID,chanquanren from inserted i
if update (chanquanren)
update Tyezhuinfo set yezhuname=i.chanquanren from inserted i where Tyezhuinfo.yezhuID=i.fangwuID and yezhuname <> i.chanquanren--更新前后内容相同便停止更新
end

CREATE TRIGGER [Tri_update_inYZ] ON [dbo].[Tyezhuinfo]
FOR UPDATE
AS
begin
if update (yezhuname)
update Tfangwuinfo set chanquanren=i.yezhuname from inserted i where Tfangwuinfo.fangwuID=i.yezhuID and chanquanren <> i.chanquanren----更新前后内容相同便停止更新