第 9讲触发器引例思考:当学生报名选修 SQLServer实用技术课程时,WillNum应自动加 1,如何处理?
触发器的作用
在指定的表中数据发生变化时被调用以响应 INSERT,UPDATE
或 DELETE事件
强制执行业务规则创建简单的触发器
【 问题 】 创建一个触发器 Test1,要求每当在 Student表中修改数据时,
向客户端显示一条,记录已修改!,
的消息
SQL格式:
CREATE TRIGGER trigger_name
On table
[WITH ENCRYPTION]
{FOR|AFTER| INSTEAD OF} {[INSERT]
[UPDATE] [DELETE]}
AS
sql_statement
在企业管理器中查看触发器信息
FO
R/
AF
TE
R/
IN
ST
EA
D
OF
的比较
【 问题 】 将上例中触发器中的 FOR
UPDATE改为 INSTEAD OF UPDATE,
查看执行结果有何不同。
总结:
使用 FOR/AFTER时,执行 触发 SQL语句
( INSERT/UPDATE/DELETE):在触发
SQL语句成功执行后,再执行 触发器
使用 INSTEAD OF时:执行 触发器 而不执行 触发 SQL语句练习
1
1,创建一个触发器,要求每当在
StuCou表中插入数据时,向客户端显示一条,记录已添加!,的消息。
2,创建一个触发器,要求每当用户插入 student表的记录时,自动显示表中所有内容
IN
SE
RT
ED
表和DE
LE
TE
D

系统为每个触发器都自动创建了 INSERTED表和 DELETED表
INSERTED表用于存放插入操作时的行; DELETED表用于存放删除操作时的行
这两个表的结构和被触发器作用的表的结构相同
用户不能对这两个表进行修改,
但可以读取练习
2
1,创建一个触发器,要求每当用户插入 student表的记录后,
自动显示 Student表中插入的记录创建触发器
【 问题 】 创建一个触发器
SetWillNum,要求当插入、更新、删除 StuCou表的选课记录时,能更新 Course表中相应的报名人数。
说明:该触发器只适用于每次新增、删除一条记录的情况。
创建批量数据触发器
思考:若有批量的数据新增、
插入或删除,应该如何修改上例中的触发器?
处理多条记录的触发器简单、
易维护,但每次都更新 Course
中每条记录的报名人数,效率不高
IF
UP
DA
TE
的应用
【 问题 】 创建一个触发器 Test1,
要求每当 student表中修改 pwd
列的数据时,向客户端显示一条消息,密码已更改,的消息。
特点:只有当 IF UPDATE指明的列发生修改时,才触发执行触发器。
级联更新和删除:
【 练习 】 创建触发器,当修改
student表中的学号字段后,自动修改 stucou表中相应的学号。(以前采用外键方式)
【 练习 】 在 student表上创建触发器
del_trg,当删除表中某一个学生的记录时,能自动删除掉该学生的所有成绩记录重命名

删除触发器
重命名触发器 SQL格式:
sp_rename oldname,newname
删除触发器 SQL格式:
DROP TRIGGER trigger_name
说明:删除触发器所在的表时,
SQL Server将会自动删除与该表相关的触发器管理触发器
禁用触发器
ALTER TABLE table_name
DISABLE TRIGGER trigger_name
恢复使用触发器
ALTER TABLE table_name
ENABLE TRIGGER trigger_name
显示数据库中有哪些触发器
请参考联机丛书,sysobjects系统表”
使用注意事项总结
CREATE TRIGGER要在单个批处理中执行
ON table中的表格只能是一个
在同一条 CREATE TRIGGER语句中,可以为多个事件
( INSERT/DELETE/UPDATE定义相同的触发器操作)
可以为每个事件
( INSERT/DELETE/UPDATE)创建多个触发器本章小结
理解:触发器的作用
创建、管理触发器的方法(重点)
如何设计触发器以简化系统设计(进一步的要求)