110,528
社区成员
发帖
与我相关
我的任务
分享
create trigger tri_updatepid
on Product
for update
as
declare @pid int
select @pid =ProductNid from Product
if (@classn<0) -- 也有这样写的: if Update(ProductNid)
begin
Update Product set ProductNid=0
end
go
create trigger tri_updateclass
on Class
for update
as
update Product set ProductNid =0
from Product as a inner join inserted as b on a.Id= b.Id
where b.ClassNum<0
go
update abc set field_a=0
from abc as a inner join inserted as b on a.id= b.id
where b.field_a<0
update abc set field_a=0
from abc as a inner join inserted as b on a.id= b.id
where a.field_a<0
这样,将<0 的值再次改为0。
在触发器中写declare @pid int
select @pid =ProductNid from Product
这类代码是不合格的,我发现有些比较“坑”的博客中也这样写。
触发器是针对数据库会话的改变语句来触发,那么应用端往往是一条语句就修改多条记录,怎么可能是恰好只修改一条记录呢?
上面这种写法是想当然地以为任何应用修改数据库都是一次会话只修改一条记录,当应用处理多条记录时它只处理一条记录的触发器规则,所以上面的写法是错误的。虽然不报错,于是把不懂技术、也不谨慎的老板蒙过去了,但是这种语句在处理多记录更新触发事件时其结果就是错的。