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

这样的触发器该怎么写呢
SQL code

对冲触发器
tb_发货
编号        订单号        客户名称             品名      型号      发货数量
1           2012001       美的有限公司         电饭锅    小型         1
2           2012001       美的有限公司         电饭锅    小型         1

3           2012001       美的有限公司         电饭锅    中型         1
4           2012001       美的有限公司         电饭锅    中型         1

5           2012001       美的有限公司         电饭锅    大型         1
6           2012001       美的有限公司         电饭锅    大型         1


tb_订单
编号        订单号        客户名称              品名      型号       订购数量         发货数量          未发货数量       订单状态       完成日期
1            2012001       美的有限公司          电饭锅    小型         2                 0                  2            未完成        null
2            2012001       美的有限公司          电饭锅    中型         2                 0                  2            未完成        null
3            2012001       美的有限公司          电饭锅    大型         2                 0                  2            未完成        null


tb_发货  增加、删除、更新,自动更新tb_订单
如上例,自动将tb_订单,发货数量、未发货数量填充,并判断未发货数量是否为0,如为零自动将订单状态设置为“完成”,并将完成日期设置









------解决方案--------------------
以插入为例,其余自己写
create trigger t1
on tb_发货
for insert 
as
update tb_订单
set 发货数量=发货数量+inserted.发货数量,
未发货数量=未发货数量-inserted.发货数量,
状态=case when 未发货数量-inserted.发货数量=0 then '完成' end
日期=getdate()


------解决方案--------------------
以前回答的一个帖子,你参考一下吧

SQL code

各位大哥大姐、我的数据库里面有USERID表(ID(登录ID),PASSWORD(密码),QUANXIAN(权限))
和另外一个STUDENT表(SNO(学号),SNAME(姓名)````````)、现在我想建立触发器就当我添加学生(学号)
资料时就自动在USERID表中添加相应的ID,密码,权限,ID和学号一样,PASSWORD(密码)也和学号一样,权限是“学生”。
 当我修改更新(学号)资料,在USERID表中也修改相应的ID和和PASSWORD。 当我删除学生资料时,在USERID表中也删除相应ID的全部资料。 
这个怎么实现啊。。这样的触发器怎么实现、用多个触发器实现也行,希望各位帮帮忙

create table STUDENT
(SNO int,SNAME nvarchar(10))

create table USERID
(ID int ,PASSWORD int,QUANXIAN nvarchar(10))


Create trigger tr_STUDENT on STUDENT
for insert,update,delete
as

 --insert
 IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
 begin 
  insert into USERID
  select SNO,SNO,'学生' from inserted
 end
 
 --update
 IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
 BEGIN
    --USERID有问题,应该有个主键字段,否则在批量更新时,无法找到对应的主键
    declare @DeleteID int
    declare @InsertID int
    select @DeleteID=SNO from deleted
    select @InsertID=SNO from inserted
    update USERID set ID=@InsertID,PASSWORD=@InsertID where ID=@DeleteID

 end
  
  --delete
  IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
  BEGIN
   delete A from USERID A,deleted B where A.ID=B.SNO
  end
  

--insert
insert into STUDENT select 1,'aaa'
select * from USERID
--update
update student set sno=2 where sno=1
select * from USERID
--delete
delete from student
select * from USERID

------解决方案--------------------
SQL code


go
if OBJECT_ID('tri_tracy')is not null
drop trigger tri_tracy
go
create trigger tri_tracy on [tb_发货]
for insert,update,delete
as
--如果是插入
if exists(select 1 from inserted)
       and not exists(select 1 from deleted)
begin
update [tb_订单] 
set [发货数量]=[tb_订单].[发货数量]+I.[发货数量],
[未发货数量]=[tb_订单].[订购数量]-I.[发货数量],
[订单状态]=(case when ([tb_订单].[订购数量]-I.[发货数量])=0 then '完成' else '未完成' end),
[完成日期]=(case when ([tb_订单].[订购数量]-I.[发货数量])=0 then getdate() else null end)
from inserted I where [tb_订单].[订单号]=I.[订单号] and [tb_订单].[品名]=I.[品名]
AND [tb_订单].[型号]=I.[型号]
end
--如果是删除
if not exists(select 1 from inserted)
       and exists(select 1 from deleted)
begin
update [tb_订单] 
set [发货数量]=[tb_订单].[发货数量]+d.[发货数量],[未发货数量]=[tb_订单].[订购数量]-d.[发货数量],
[订单状态]='未完成',[完成日期]=null
from deleted d where [tb_订单].[订单号]=d.[订单号] and [tb_订单].[品名]=d.[品名]
AND [tb_订单].[型号]=d.[型号]
end
--如果是修改
if exists(select 1 from inserted) and exists(select