数据库实验七

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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'

相关文档
最新文档