数据库实验七
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七触发器
一、实验目的
(1)理解触发器的用途、类型和工作原理
(2)掌握利用T-SQL语句创建和维护触发器的方法
(3)掌握利用企业管理器创建、维护触发器的方法
二、实验内容
1.创建after触发器
(1)创建一个在插入时触发的触发器sc_insert,当向sc表插入数据时,须确保插入的学号已在student表中存在,并且还须确保保插入的课程号在course表中存在;若不存在,则给出相应的提示信息,并取消插入操作,提示信息要求指明插入信息是学号不满足条件还是课程号不满足条件。(注:student表与sc表的外键约束要先取消)。
触发器的触发执行测试语句(T-SQL):
alter table SC
drop constraint FK__SC__Cno__29572725,FK__SC__Sno__286302EC
create trigger sc_insert on SC
for insert
as
begin
if exists(select Sno from inserted where Sno not in(select Sno from Student)) print'not Sno'
delete
from SC
where Sno not in(select Sno from Student)
if exists(select Cno from inserted where Cno not in(select Cno from Course)) print'not Cno'
delete from SC
where Cno not in(select Cno from Course)
end;
insert into SC(Sno,Cno,Grade)
values('20050002','002',74)
(2)为course表创建一个触发器course_del,当删除了course表中的一条课程信息时,同时将表sc表中相应的学生选课记录删除掉。
触发器的触发执行测试语句(T-SQL):
create trigger Course_del on Course
for delete
as
begin
delete
from SC
where o in(select Cno from deleted) end;
delete
from Course
where Cno='002'
未删除课程号之前:
删除课程号之后:
(3)在course表中添加一个平均成绩avg_grade字段(记录每门课程的平均成绩),创建一个触发器grade_modify,当SC表中的某学生的成绩发生变化时,则course表中的平均成绩也能及时相应的发生改变。
触发器的触发执行测试语句(T-SQL):
use Student_info_20101766
alter table Course
add avg_grade smallint
update Course
set avg_grade=(select avg(grade)
from sc
where o=o)
create trigger grade_modify on S C
for update,insert,delete
as
begin transaction
if update(Grade)
begin
update Course
set avg_grade=(select avg(Grade)
from SC
where o=o) where Cno in(select Cno from inserted)
end
else
begin
update Course
set avg_grade=(select avg(Grade)
from SC
where o=o) where Cno in(select Cno from deleted)
end
commit transaction
未更新成绩之前的数据:
update SC
set Grade=95
where Sno='20110001'and Cno='003'
更新成绩之后的数据:
2.创建instead of 触发器
(1)创建一视图student_view,包含学号、姓名、课程号、课程名、成绩等属性,在student_view上创建一个触发器grade_moidfy,当对student_view中的学生的成绩进行修改时,实际修改的是sc中的相应记录。
触发器的触发执行测试语句
create view student_view
as
select Student.Sno,Sname,o,Cname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno
and o=o
create trigger grade_moidfy
on student_view
instead of update
AS
begin
if update(Grade)
update SC
set Grade=(select Grade from inserted) where Sno=(select Sno from inserted) and Cno=(select Cno from inserted) end
update student_view
set Grade=95
where Sno='20110002'and Cno='003'