触发器简介: 触发器(trigger)是个特殊的存储过程,与存储过程不同的是,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,即当某个事件发生时,触发器自动的隐式运行,触发器不能像存储过程一样,接收参数。
触发器执行环境:
第一:触发器正确执行所必需的信息,这些信息由触发器本身的细节和触发器所定义的目标表。
第二:还包括一个或两个测试表,称之为INSERTED表和DELETED表。测试表示虚表,用于保存目标更新、插入或删除的数据信息,用户不能直接修改测试表中的数据,但能通过SELECT语句,来检测INSERT,UPDATE或DELETE的结果。
各种类型触发器用到的测试表:
inserted:
![](https://img-blog.csdn.net/20130603174327437)
存放INSERT和UPDATE语句中的副本,在INSERT或UPDATE语句的执行中,这些新行同时被加到inserted表和tigger表中,inserted表中的行是trigger表中新行的副本。
deleted:
![](https://img-blog.csdn.net/20130603174255265)
存放DELETE和UPDATE语句中相关行的副本,在DELETE或UPDATE语句的执行中,这些相关行从trigger表中移到了deleted表中,一般情况下,这两张表无共同行。
update:
![](https://img-blog.csdn.net/20130603174705281)
一个UPDATE效果等效于一个DELETE再一个INSERT。首先旧行被复制到deleted表中,然后新行被复制到trigger表和inserted表中。
触发器创建:
INSERT触发器示例:
- create trigger T_addStudent
- on StudentInfo
- for insert
- as
- update ClassInfo set totalNum=totalNum+1
- where ClassNo = (select StuClass from inserted)
UPDATE触发器示例:
- create trigger t_Update
- on TeacherInfo
- for update
- as
- if (update(TeacherName)or update(sex))
- begin
- print'事物不能被处理,基本数据不能修改!'
- rollback transaction
- end
- else
- print'数据修改成功!
DELETE触发器示例:
create trigger T_Delete on dbo.studentinfo
for delete
as
update dbo.studentinfo
set User_ID=(select count(*)
from dbo.studentinfo t1
where t1.User_ID<TRIGGER_.User_ID)+1
from dbo.studentinfo