实验名称 实验8 综合实验 日期 2020年 6 月 19 日
一、实验目的:
(1)理解触发器的用途、类型和工作原理
(2)掌握利用T-SL语句创建和维护触发器的方法
(3)掌握利用企业管理器创建、维护触发器的方法
二、实验环境:
PC + Windows + SQL Server
三、实验内容
创建 after/触发器
(1)创建一个在插入时触发的触发器sc_insert,当向sc表插入数据时,须确保插入的学号己在 Student表中存在,并且还须确保插入的课程号在 Course表中存在:若不存在,则给出相应的提示信息,并取消插入操作,提示信息要求指明插入信息是学号不满足条件还是课程号不满足条件(注: Student表与sc表的外键约束要先取消)。
if exists(select name from sysobjects where name='sc_insert' and type='tr')
drop trigger sc_insert
go
create trigger sc_insert
on SC
after insert
as
if not exists(select * from Student,inserted where Student.Sno=inserted.Sno)
begin
print '插入信息的学号不在学生表中!'
if not exists(select * from Course,inserted where Course.Cno=inserted.Cno)
print '插入新的课程号不在课程表中!'
rollback
end
else
begin
if not exists(select * from Course,inserted where Course.Cno=inserted.Cno)
begin
print '插入信息的课程号不在课程表中!'
rollback
end
end
(2)为Course表创建一个触发器Course_del,当删除了Course表中的一条课程信息时,同时将表sc表中相应的学生选课记录删除掉。
if exists(select name from sysobjects where name='Course_del' and type='tr')
drop trigger Course_del
go
create trigger Course_del
on Course
after delete
as
if exists(select * from SC,deleted where SC.Cno=deleted.Cno)
begin
delete from SC
where SC.Cno in(select Cno from deleted)
end
(3)在Course表中添加一个平均成绩avg_Grade字段(记录每门课程的平均成绩),创建一个触发器 Grade_modify,当SC表中的某学生的成绩发生变化时,则Course表中的平均成绩也能及时相应的发生改变。
alter table Course
add avg_Grade smallint;
update Course
set avg_Grade=(select avg(Grade) from SC where SC.Cno=Course.Cno)
if exists(select name from sysobjects where name='Grade_modify' and type='tr')
drop trigger Grade_modify
go
create trigger Grade_modify
on SC
after update
as
if update(Grade)
begin
update Course
set avg_Grade=(select avg(Grade) from SC where Course.Cno=SC.Cno group by Cno)
end
(4)测试以上3个触发器
sc_insert
Course_del
Grade_modify
四、心得体会(150字以上):
通过此次实验,理解了触发器的用途、类型和工作原理,掌握了如何利用T-SL语句创建和维护触发器的方法,掌握了利用企业管理器创建、维护触发器的方法。
触发器是用户定义在关系表上的一类由事件驱动的特殊过程,也是一种保证数据完整性的方法。触发器实际上是一类特殊的存储过程,其特殊性表现在一旦定义,无须用户调用,任何对表的修改操作均由服务器自动激活相应的触发器。触发器的主要作用是实现主键和外键不能保证的复杂的参照完整性和数据一致性。