INSERT触发器
INSERT及UPDATE触发器经常用于检测触发器所监控表的列及其数据是否符合所定义的规则。它们可以在数据输入表之前,对其进行在定义引用完整性时无法完成的约束检验。
下面以学生数据库student为例来介绍INSERT触发器的使用。该数据库包括三个表,分别是描述学生情况的“学生档案”表、描述学生成绩的“学生成绩”表student和。描述分组情况的“分组情况”表gro。
create table student (id numeric(1,0),name varchar(10),sex char(4),class varchar(10),gro numeric(1,0) )
create table gro (class varchar(10),gro numeric(1,0) ,num tinyint)
为上面的“学生档案” 表创建一个INSERT触发器instrg,其作用是每新增一名学生而需向“学生档案”表中插入新行时,在“分组情况”表中将其所在小组的人数自动增加1。
use mlh
Create Trigger instrg ON [dbo].[student]
FOR Insert
AS
declare @班级 varchar(50) ,@小组 varchar(50),@人数 tinyint
select @班级 = inserted.class,@小组 = inserted.gro from inserted
if exists(select num from gro where @班级 = gro.class and @小组= gro.gro)
begin --bg1
select @人数 = num from gro where @班级= gro.class and @小组 = gro.gro
set @人数 = @人数 + 1
update gro set num = @人数 where @班级 = gro.class and @小组 = gro.gro
end --bg1
else
begin --bg2
insert gro values(@班级,@小组,1)
end --bg2
UPDATE 触发器
Create Trigger stup On [dbo].[student]
FOR update
AS
Declare @班级 varchar(50) , @小组 numeric(1,0),@人数 tinyint
select @班级 = inserted.class ,@小组= inserted.gro from inserted
if exists(select * from gro where @班级 = gro.class and @小组 = gro.gro)
begin
update gro set gro.num = gro.num + 1 where @班级 = gro.class and @小组 = gro.gro
end
else
begin
insert into gro values(@班级,@小组,1)
end
select @班级 = deleted.class ,@小组= deleted.gro from deleted
select @人数 = gro.num from gro where @班级 = gro.class and @小组 = gro.gro
if @人数 > 1
begin
update gro set gro.num = gro.num - 1 where @班级 = gro.class and @小组 = gro.gro
end
else
begin
delete gro where @班级 = gro.class and @小组 = gro.gro
end