实验七 触发器
一.实验目的
(1)理解触发器的用途、类型和工作原理。
(2)掌握利用T-SQL语句创建和维护触发器的方法。
(3)掌握利用SQL Server Management Studio创建、维护触发器的方法。
二.实验内容
-
创建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 BEGIN declare @sno char(8),@cno char(8) select @sno=Sno , @cno=Cno from inserted if not exists(select Sno from Student where @sno=Sno) begin rollback tran print('学号不存在') end else if not exists(select Cno from Course where @cno=Cno) begin rollback tran print('课程号不存在') end END GO
(2)为Course表创建一个触发器Course_del,当删除了Course表中的一条课程信息 时,同时将表SC中相应的学生选课记录也删除。
CREATE TRIGGER Course_del ON Course AFTER DELETE AS begin transaction declare @cno char(8) select @cno=Cno from deleted delete from SC where Cno=@cno commit transaction GO
(3)在Course表中添加一个平均成绩avg_grade字段(记录每门课程的平均成绩),创建一个触发器grade_modify,当SC表中的某学生的成绩发生变化时,则Course表中的平均成绩也能及时相应发生改变。
alter table Course add avg_grade int; update Course set avg_grade=( select avg(Grade) from SC where SC.Cno=Course.Cno);
CREATE TRIGGER grade_modify ON SC AFTER UPDATE AS BEGIN if update(Grade) begin update Course set avg_grade=( select avg(Grade) from SC where SC.Cno=Course.Cno group by Cno) end END GO
(4)测试上述三个触发器。
1.测试sc_insert触发器insert into SC values('20220002','011',99)
删除外键约束alter table SC drop constraint FK__SC__Sno__6477ECF3; alter table SC drop constraint FK__SC__Cno__656C112C;
insert into SC values('20110002','006',71);
insert into SC values('20110005','001',71);
insert into SC values('20110002','011',71);
2.测试Course_del触发器delete from Course where Cno='010';
3.测试grade_modify触发器update SC set Grade=70 where Sno='20110001' and Cno='001';
-
创建INSTEAD OF 触发器
(1)创建一视图student_view,包含学号、姓名、课程号、课程名、成绩等属性,在student_view上创建一个触发器grade_modify,当对student_view中的学生的成绩进行修改时,实际修改的是SC中的相应记录。
创建视图create view student_view as select Student.Sno,Sname,Course.Cno,Cname,Grade from Student,Course,SC where Student.Sno=SC.Sno and Course.Cno=SC.Cno;
创建触发器
CREATE TRIGGER grade_modify2 ON student_view INSTEAD OF UPDATE AS BEGIN if update(Grade) begin update student_view set Grade=(select Grade from inserted) where Sno=(select Sno from inserted) and Cno=(select Cno from inserted) end END GO
(2)在Student表中插入一个getcredit字段(记录学生所获学分的情况),创建一个触发器ins_credit,当更改(注:含插入时)SC表中的学生成绩时,如果新成绩大于等于60分,则该生可获得这门课的学分,如果新成绩小于60分,则该生未能获得这门课的学分。
--添加字段 alter table Student add getcredit tinyint; go --更新Student表 update Student set getcredit=( select sum(Credit) from Course,SC where Course.Cno=SC.Cno and Student.Sno=SC.Sno) go --创建触发器 CREATE TRIGGER ins_credit ON SC AFTER UPDATE,INSERT AS BEGIN declare @sno char(8),@credit tinyint select @sno=Sno,@credit=Credit from Course,inserted where Course.Cno=inserted.Cno and inserted.Grade>=60 update Student set getcredit=getcredit+@credit where Sno=@sno END GO
(3)测试上述两个触发器。
1.测试grade_modify2update student_view set Grade=50 where Sno='20110002' and Cno='001'
2.测试ins_credit触发器update SC set Grade=59 where Sno='20110001' and Cno='002';
这里就是在表结构修改之后的添加或者插入数据才会在Student表中生效
-
使用T-SQL语句管理和维护触发器
(1)用系统存储过程sp_helptrigger查看触发器grade_modify的相关信息。sp_helptrigger 'student_view';
(2)使用sp_helptext查看触发器grade_modify中的定义内容。
sp_helptext 'grade_modify2';
(3)使用select语句查看触发器grade_modify的定义内容。
select name,text from sysobjects,syscomments where sysobjects.id=syscomments.id and name='grade_modify2' and type='TR'
(4)用系统存储过程sp_depends查看触发器grade_modify的相关性(即该触发器涉及哪些基本表)。
sp_depends 'grade_modify2';
(5)将sc_insert触发器改为instead of 触发器,实现的功能不变。
drop trigger sc_insert;
CREATE TRIGGER sc_insert ON SC INSTEAD OF INSERT AS BEGIN declare @sno char(8),@cno char(8) select @sno=Sno , @cno=Cno from inserted if not exists(select Sno from Student where @sno=Sno) begin rollback tran print('学号不存在') end if not exists(select Cno from Course where @cno=Cno) begin rollback tran print('课程号不存在') end END GO
测试:
(6)将触发器sc_insert删除。
drop trigger sc_insert;
-
使用SQL Server Management Studio管理触发器
(1)在SQL Server Management Studio中重新创建刚删除的触发器sc_insert。
展开要创建触发器的数据库,在数据库目录下选择要创建触发器的表,展开数据表,在数据表结点下右击"触发器",然后选择"新建触发器"
在此位置编写触发器的语句:
如下:
最后执行即可创建成功(2)查看触发器sc_insert 的内容。
(3)删除触发器sc_insert。
更多推荐
所有评论(0)