sql触发器问题?急!!!

wolvesroad 2010-10-11 03:04:41
如下表:
表一:(tab_1)
id no_1 no_2
1 1200 1200
表二:(tab_2)
id no id_tab_1
1 100 1
2 200 1
3 300 1
4 300 1
在tab_2上建立一个触发器如下:
create trigger delete_tab_1_trig on tab_2
for delete
as
begin
update a
set a.no_2=a.no_2-b.no
from tab_1 a inner join deleted b on a.id=b.id_tab_1
end

操作如下:
delete from tab_2
结果tab_1中的no_2只减去了100(也就是tab_2的第一条记录触发了,其他的都没有),什么原因?多谢指教!!!

...全文
104 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolvesroad 2010-10-11
  • 打赏
  • 举报
回复
搞定了,多谢!
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wolvesroad 的回复:]

SQL code
update a
set a.numroll_now=a.numroll_now-b.num_roll,a.weight_now=a.weight_now-b.weight_sinlib
from wm_invfil a inner join
(select a.materialid as materialid,c.id_quote_info,……
[/Quote]

a.code=b.materiali

中间结果集b的materiali唯一就没问题
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
why not?

先 group by 生成一个结果集,再与其它表关联,保证了 deleted.id_tab_1 是唯一的。
wolvesroad 2010-10-11
  • 打赏
  • 举报
回复
触发器是在wm_sinlib_info 上
wolvesroad 2010-10-11
  • 打赏
  • 举报
回复
update a
set a.numroll_now=a.numroll_now-b.num_roll,a.weight_now=a.weight_now-b.weight_sinlib
from wm_invfil a inner join
(select a.materialid as materialid,c.id_quote_info,sum(c.num_roll)as num_roll,sum(c.weight_sinlib)as weight_sinlib from sm_salord_info a
inner join sm_delnot_info b on a.id=b.id_salord_info
inner join wm_sinlib_info c on b.id=c.id_quote_info group by a.materialid,c.id_quote_info)b on a.code=b.materialid


上面有四个表:wm_invfil,sm_salord_info,sm_delnot_info,wm_sinlib_info
wolvesroad 2010-10-11
  • 打赏
  • 举报
回复
如果中间是多个表的关联,用这种方法可行吗?
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wolvesroad 的回复:]
是inserted 还是deleted
[/Quote]
sorry 是 deleted
wolvesroad 2010-10-11
  • 打赏
  • 举报
回复
多谢!!!知道了,谢谢二位!
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
#6

deleted
黄_瓜 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sqlcenter 的回复:]
引用 1 楼 beirut 的回复:

sql 触发器不支持批处理。
它是按语句触发的,也就是说delete 删除0个或100个 它都只触发一次


对,但是T-SQL本身是集合(批)处理的,看如何写。
[/Quote]
看错了,呵呵,老了
黄_瓜 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beirut 的回复:]
sql 触发器不支持批处理。
它是按语句触发的,也就是说delete 删除0个或100个 它都只触发一次
[/Quote]
jiong 看错了。。。。。。。。。。。。。。。。。。
wolvesroad 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sqlcenter 的回复:]
SQL code
update a
set a.no_2=a.no_2-b.no
from
tab_1 a
inner join
(select id_tab_1,sum([no]) as [no] from inserted group by id_tab_1) b
on a.id=b.id_tab_1
[/Quote]

是inserted 还是deleted
软件钢琴师 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beirut 的回复:]
sql 触发器不支持批处理。
它是按语句触发的,也就是说delete 删除0个或100个 它都只触发一次
[/Quote]
你可以在你的触发器里根据条件 进行判断及处理,虽然只触发一次
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beirut 的回复:]

sql 触发器不支持批处理。
它是按语句触发的,也就是说delete 删除0个或100个 它都只触发一次
[/Quote]

对,但是T-SQL本身是集合(批)处理的,看如何写。
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
update a
set a.no_2=a.no_2-b.no
from
tab_1 a
inner join
(select id_tab_1,sum([no]) as [no] from inserted group by id_tab_1) b
on a.id=b.id_tab_1
wolvesroad 2010-10-11
  • 打赏
  • 举报
回复
那如何解决呢,有什么好办法?多谢
黄_瓜 2010-10-11
  • 打赏
  • 举报
回复
sql 触发器不支持批处理。
它是按语句触发的,也就是说delete 删除0个或100个 它都只触发一次

34,593

社区成员

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

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