有如下触发器:
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型的触发器不是按每行触发一次执行的。
祝你好运!
javascrip thymeleaf 按钮跳转 java按钮实现页面跳转
一、实现按钮跳转技术<button type="button" οnclick="javascript:location='studentinsert.jsp'">录入</button>
<button formaction="studnetlist.jsp(Java文件,后不加后缀)">返回</button>二、jsp技术JSP页面由HTML代码和