实验七 触发器.docx
实验七触发器
一、实验目得
(1)理解触发器得用途、类型和工作原理
(2)掌握利用T-SQL语句创建和维护触发器得方法
(3)掌握利用企业管理器创建、维护触发器得方法
二、实验内容
1、创建after触发器
(1)创建一个在插入时触发得触发器sc_insert,当向sc表插入数据时,须确保插入得学号已在Student表中存在,并且还须确保插入得课程号在Course表中存在;若不存在,则给出相应得提示信息,并取消插入操作,提示信息要求指明插入信息就就是学号不满足条件还就就是课程号不满足条件(注:Student表与sc表得外键约束要先取消)。
createtriggersc_insert
onsc
afterinsert
as
ifnotexists(select*fromstudent,inserted
?? wherestudent、sno=inserted、sno)
?begin
print'插入信息得学号不在学生表中!
?ifnotexists(select*fromcourse,insertedwherecourse、cno=inserted、cno)
? print插入信息得课程号不在课程表中!
?rollback
end
else
begin
? ifnotexists(select*fromcourse,insertedwherecourse、cno=inserted、cno)
?begin
??print插入信息得课程号不在课程表中!
???rollback
?end
end
执行:
=1\*GB3①、insertintoSC
values001',78)
删除外键约束:
altertableSC
dropconstraintFK__SC__Sno__182C9B23
=2\*GB3②、insertintoSC
values(001,78)
=3\*GB3③、insertintoSC
values006,78)
(2)为Course表创建一个触发器Course_del,当删除了Course表中得一条课程信息时,同时将表sc表中相应得学生选课记录删除掉。
createtriggercourse_del
oncourse
afterdelete
as
ifexists(select*fromsc,deleted
?? wheresc、cno=deleted、cno)
begin
deletefromsc
?wheresc、cnoin(selectcnofromdeleted)
end
deletefromCourse
whereCno=003'
select*fromSC
(3)在Course表中添加一个平均成绩avg_Grade字段(记录每门课程得平均成绩),创建一个触发器Grade_modify,当SC表中得某学生得成绩发生变化时,则Course表中得平均成绩也能及时相应得发生改变。
altertableCourse
addavg_Gradesmallint
updateCourse
setavg_Grade=(selectAVG(Grade)fromSC
whereSC、Cno=Course、Cno)
select*fromCourse
createtriggerGrade_modify
onsc
afterupdate
as
ifupdate(grade)
begin
? updatecourse
??setavg_grade=(selectavg(grade)
? ?fromscwherecourse、cno=sc、cno
? groupbycno)
end?
updateSC
setGrade=90
whereSnoandCno='001'
(4)测试上述三个触发器。
测试过程在(1)、(2)、(3)中均给出
2、创建insteadof触发器
(1)创建一视图Student_view,包含学号、姓名、课程号、课程名、成绩等属性,在Student_view上创建一个触发器Grade_moidfy,当对Student_view中得学生得成绩进行修改时,实际修改得就就是sc中得相应记录。
createviewStudent_view
as
selects、Sno,Sname,c、Cno,Cname,Grade
fromStude