触发器的问题

hxshxs 2008-08-24 09:48:35
我有两张表,其中selectCouse是一个多外键表,
selectCouse(..........,banjiid),bj(bjid,cmax)
当表selectCouse的记录发生变化时,对selectCouse分组统计,然后把统计结果写入表B的cmax
我是这样写的触发器,我知道在trigger里面不用引用自己的表名,总是报错。


CREATE TRIGGER udi_selectCouse
ON selectCouse
FOR INSERT,UPDATE,DELETE
AS

update bj set cnum=aa.num from
(select count(*) num,banjiid from selectcourse group by banjiid) aa,bj bb where aa.banjiid=bb.bjid

小弟用sqlserver不是很多,请各路高手指点,给个正确的触发器的写法,不胜感谢
...全文
132 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
linco001 2008-08-25
  • 打赏
  • 举报
回复


CREATE TRIGGER udi_selectCouse
ON selectCouse
FOR INSERT,UPDATE,DELETE
AS
begin

update bj set cmax=aa.num
from (select count(*) num,banjiid from selectcource where banjiid in (select banjiid from inserted)
or banjiid in (select banjiid from deleted)
group by banjiid) aa,bj bb where aa.banjiid=bb.bjid
--只删除记录时并全部删除掉时就删除bj表的相应记录
delete bj whree bjid in (select banjiid from deleted) and cmax = 0

end


linco001 2008-08-25
  • 打赏
  • 举报
回复
除了你上头写了一个cmax,后来写成cnum 别的没见有什么错误。

楼上的考虑的比较周到。解决了数据冗余问题!
但是好像写的不对。当执行insert时,deleted集合肯定为空。所以:
if not exists(select * from inserted) and not exists(select * from selectcouse where banjiid in (select banjiid from deleted))
始终为true!

只要
CREATE TRIGGER udi_selectCouse
ON selectCouse
FOR INSERT,UPDATE,DELETE
AS
begin

update bj set cmax=aa.num
from (select count(*) num,banjiid from selectcource where banjiid in (select banjiid from inserted)
or banjiid in (select banjiid from deleted)
group by banjiid) aa,bj bb where aa.banjiid=bb.bjid
--只删除记录时并全部删除掉时就删除bj表的相应记录
delete bj whree bjid in (select banjiid from deleted) and cmax = 0

end
cxmcxm 2008-08-25
  • 打赏
  • 举报
回复
加上查询条件,只查询添加,修改与删除的记录
CREATE TRIGGER udi_selectCouse 
ON selectCouse
FOR INSERT,UPDATE,DELETE
AS


update bb set cmax=aa.num
from (select count(*) num,banjiid from selectcource where banjiid in (select banjiid from inserted)
or banjiid in (select banjiid from deleted)
group by banjiid) aa,bj bb where aa.banjiid=bb.bjid
--只删除记录时并全部删除掉时就删除bj表的相应记录
if not exists(select * from inserted) and not exists(select * from selectcouse where banjiid in (select banjiid from deleted))
delete bj whree bjid in (select banjiid from deleted)
anovice 2008-08-24
  • 打赏
  • 举报
回复
只有当 select count(*) num,banjiid from selectcourse group by banjiid 只有一个值时,才不报错
anovice 2008-08-24
  • 打赏
  • 举报
回复
update bj set cnum=aa.num from
(select count(*) num,banjiid from selectcourse group by banjiid) aa,bj bb where aa.banjiid=bb.bjid

这句运行没有错吗??
tianhuo_soft 2008-08-24
  • 打赏
  • 举报
回复
up

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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