触发器

触发器:
一、什么是触发器?
一段SQL代码,挂到某个表的某个增、删、改的操作上。
当这个表执行相应的操作时,就会触发这段相应的SQL代码。
触发器与存储过程的区别:
1.存储过程是独立于表存在的,触发器需要依附某个表的某个操作。
2.存储过程需要使用名称去调用才能执行,触发器则在表的操作过程中自动被触发调用。

二、触发器的分类:
after触发器
——先执行表的增删改的操作后,再触发触发器。

instead of 触发器
——不执行表的增删改操作,它的这些操作只起到取触发触发器的功能。

三、创建触发器的语法
create trigger 触发器名 on 表名 after/instead of insert/delete/update
as
go

四、触发器中两个临时表:inserted,deleted
这两个表是临时表,触发器执行完成后,会自动消失,再次触发会再次创建。
这两个表的结构与on后面的那表的结构是一样的(列名、列数、类型)。而且里面只有一条记录。

插入操作--把新增的数据放到inserted表中。
删除操作--把删除的数据放到deleted表中。
修改操作--把旧数据放到deleted表中,把新数据放到inserted表中。

五、对两个临时表的使用。
从两个临时表中把数据取出来放到变量中,以备后面的使用。


案例一:做一个汽车变动表,汽车的增加、删除后都往变动表中增加一条。用触发器来实现。after


select* from Car
select* from carselete
delete from Car where code='c001'

create trigger car_selete on Car after delete
as
declare @name varchar(50),@price decimal(8,2)
select @name=Name,@price=Price from deleted
insert into carselete values(@name,@price)
go
create trigger car_selete on Car after insert
as
declare @name varchar(50),@price decimal(8,2)
select @name=Name,@price=Price from insertd
insert into carselete values(@name,@price)
go


案例二:把Info的数据删除,删除之前先用触发器把Work和Family两个表中的相应数据删掉。instead of触发器


select * from info
select * from work
select * from family

delete from Info where Code='p001'
create trigger info_delete on info instead of delete
as
declare @code varchar(50)
select @code=code from deleted
delete from work where @code=infocode
delete from famliy where @code=infocode
delete from info where code=@code
go

 

posted on 2015-05-31 21:21  rongzichuan  阅读(198)  评论(0编辑  收藏  举报