win10 rs4新功能:关于触发器死循环的问题

来源:百度文库 编辑:神马品牌网 时间:2024/05/08 22:46:35
有如下触发器:

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型的触发器不是按每行触发一次执行的。

祝你好运!

最好能把你的表结构写一下,