日期:2014-05-18  浏览次数:20359 次

求一触发器,子表触发更新主表
主表 A (id,rmk)
子表 A_dtl( id,cp,price ,oldprice)
主表与子表关联字段为:id

现求一触发器:当录入或者修改子表时,要往主表写字段。
条件为:

if (price >oldprice)
update A
set rmk='否'
from A ,A_dtl
where A.id=A_dtl.id

if (price <oldprice)
update A
set rmk='是'
from A ,A_dtl
where A.id=A_dtl.id

注意:
在新增时,要去循环判断子表每一件记录:只有有一条记录price <oldprice,这张单据就要rmk='是',反之:rmk='否';

在修改时,要去循环判断子表每一件记录:只有有一条记录price <oldprice,这张单据就要rmk='是'。反之:rmk='否'


如:A_dtl
SQL code


----状态1:如果录入下面数据:A表:rmk='是'
id  cp price  oldprice 
001  A   10      20
001  B   15      10






 













------解决方案--------------------
上面的有点问题,这次的正确
SQL code

create table A(id int,rmk nvarchar(10))

create table A_dtl(id int,cp varchar(10),price float,oldprice float)


Create trigger tr_xxx on A_dtl
for insert,update
as

 --insert
 IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
 begin 
  insert into A
  select id,case when price>oldprice then '否' else '是' end AS rmk from inserted
 end
 
 --update
 IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
 begin

   update a set a.rmk=(case when price>oldprice then '否' else '是' end) from A a,inserted b where a.id=b.id
 
 end


--测试
insert A_dtl select 2,'cp',300,200
select * from A

update A_dtl set price=100 where id=2

select * from A