关于触发器死循环的问题


有如下触发器:

CREATE TRIGGER tri_UpdateJobTime
ON 招聘表
FOR UPDATE
AS
BEGIN
UPDATE 招聘表 SET 更新日期=GETDATE()
WHERE 招聘id=Inserted.招聘id
END

按道理来讲,这个触发器会导致死循环,但是实际应用时,却没发现任何异样。
在查询分析器里,执行
Update 招聘表 set 工作年限=2 where 招聘id=1
时,显示影响一行,但是更新日期会被更新。
如果将触发器改为:

CREATE TRIGGER tri_UpdateJobTime
ON 招聘表
FOR UPDATE
AS
BEGIN
if not update(更新日期)
UPDATE 招聘表  SET 更新日期=GETDATE() from 招聘表 a,inserted b WHERE a.招聘id=b. 招聘id

END

则执行以上更新会显示影响2行。更新日期也会更新。
我想问一下,到底第一种写法会不会导致死循环?
为什么更新时显示影响1行?
(回复时严禁粘无关资料过来,否则不给分。)


提问者采纳

第一种写法不会导致死循环,可能是由于数据库服务器
“知道”此种情况如果按常规处理很显然的会导致死循环,
所以一个触发器中的的UPDATE语句不会再次触发该触发器
自身的执行。

如果你在用第一种写法为同一个加上两个相同内容的触发器,
则必然导致死循环(在SQL SERVER中由于存储过程最多嵌套
32层,所以会导致错误。)

假设有两个表,如果你在表1上的UPDATE触发器中修改了表2
中的内容,同时表2上的UPDATE触发器也修改了表1中的内容,
并且你的触发器也是按你的第一种情况写的,那么必定导致
递归调用,并导致错误。

我的建议是总是采用第二种写法,并要密切注意触发器的
递归触发问题,这常常是触发器容易带来的“陷阱”。

另外,在SQL SERVER中,一条外部的UPDATE语句,无论修改了
多少行记录,都只触发该表上的UPDATE触发器一次,也就是
UPDATE型的触发器不是按每行触发一次执行的。

祝你好运!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值