触发器禁用和开启

元元0123 2010-08-17 03:58:55
如何处理:比如 A表的update触发器修改B表中的字段,则B表中也含有Update触发器,并且是修改A表中的字段,怎么避免死循环,请教高手,如何当A表触发器被触发时,怎么禁用B表中的触发器,当B被触发时,同样禁用A表中的触发器,当执行完,又都恢复。先谢谢啦
...全文
716 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
元元0123 2010-08-19
  • 打赏
  • 举报
回复
楼上这位,能给具体的代码吗,我初学触发器,先谢谢各位了
fengxiaohan211 2010-08-19
  • 打赏
  • 举报
回复
如何当A表触发器被触发时,怎么禁用B表中的触发器,当B被触发时,同样禁用A表中的触发器

在A表触发器被触发时候的UPDATE触发器里面写disable B表的触发器 执行完了再enable就可以 同理B表也是
999朵玫瑰 2010-08-19
  • 打赏
  • 举报
回复
原来触发器还可以禁用啊
cxmcxm 2010-08-18
  • 打赏
  • 举报
回复
使用4楼的方法可嵌套触发造成死循环。
不过建议编程中自己控制嵌套,因为将'nested triggers'设为0,阻止死循环的同时也阻止了连环触发,很多时候希望能实现A触发B,B触发C.程序是自己编写的,象C再触发A或B再触发A这样的问题是完全可避免的。
xman_78tom 2010-08-17
  • 打赏
  • 举报
回复
最简单的办法就是关闭 nested triggers 服务器选项,禁止触发器嵌套。但是,这个会影响这个实例。
sp_configure 'nested triggers',0
go
reconfigure
go

可以在触发器中禁用其他表上的触发器。

if OBJECT_ID('A') is not null
drop table A;
go
create table A (id int identity, c char(1));
go
insert into A (c) values('A');
go

create trigger trg_update_a on A
for update
as
-- 禁用 B 上的触发器
execute('disable trigger trg_update_b on B');
with t as(
select d.c dc,i.c ic from inserted i, deleted d where i.id=d.id
)
update b set b.c=t.ic
from b,t
where b.c=t.dc;
-- 启用 B 上的触发器
execute('enable trigger trg_update_b on B');
go

if OBJECT_ID('B') is not null
drop table B;
go
create table B (id int identity, c char(1));
go
insert into B (c) values('A');
go

create trigger trg_update_b on B
for update
as
execute('disable trigger trg_update_a on A');
with t as(
select d.c dc,i.c ic from inserted i, deleted d where i.id=d.id
)
update a set a.c=t.ic
from a,t
where a.c=t.dc;
execute('enable trigger trg_update_a on A');
go

update A set c='B' where id=1;

update B set c='A' where id=1;

select * from A;
select * from B;
csuxp2008 2010-08-17
  • 打赏
  • 举报
回复
建议LZ不要用触发器,通过SP去解决不是更好
zzz1975 2010-08-17
  • 打赏
  • 举报
回复
建议通过存储过程解决,这样单纯两个表直接触发,没有试验过,呵呵,关注并支持

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧