实验七 触发器

一.实验目的

(1)理解触发器的用途、类型和工作原理。
(2)掌握利用T-SQL语句创建和维护触发器的方法。
(3)掌握利用SQL Server Management Studio创建、维护触发器的方法。

二.实验内容

  1. 创建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);
    

    实验七 触发器_第1张图片

    insert into SC values('20110002','011',71);
    

    在这里插入图片描述
    2.测试Course_del触发器

    delete from Course
    where Cno='010';
    

    实验七 触发器_第2张图片
    3.测试grade_modify触发器

    update SC
    set Grade=70
    where Sno='20110001' and Cno='001';
    

    实验七 触发器_第3张图片

  2. 创建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_modify2

    update student_view
    set Grade=50
    where Sno='20110002' and Cno='001'
    

    实验七 触发器_第4张图片
    2.测试ins_credit触发器

    update SC
    set Grade=59
    where Sno='20110001' and Cno='002';
    

    实验七 触发器_第5张图片

    这里就是在表结构修改之后的添加或者插入数据才会在Student表中生效

  3. 使用T-SQL语句管理和维护触发器
    (1)用系统存储过程sp_helptrigger查看触发器grade_modify的相关信息。

    sp_helptrigger 'student_view';
    

    实验七 触发器_第6张图片

    (2)使用sp_helptext查看触发器grade_modify中的定义内容。

    sp_helptext 'grade_modify2';
    

    实验七 触发器_第7张图片

    (3)使用select语句查看触发器grade_modify的定义内容。

    select name,text from sysobjects,syscomments 
    where sysobjects.id=syscomments.id 
    	and name='grade_modify2' and type='TR'
    

    实验七 触发器_第8张图片

    (4)用系统存储过程sp_depends查看触发器grade_modify的相关性(即该触发器涉及哪些基本表)。

    sp_depends 'grade_modify2';
    

    实验七 触发器_第9张图片

    (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
    

    测试:
    实验七 触发器_第10张图片

    (6)将触发器sc_insert删除。

    drop trigger sc_insert;
    

    在这里插入图片描述

  4. 使用SQL Server Management Studio管理触发器
    (1)在SQL Server Management Studio中重新创建刚删除的触发器sc_insert。
    展开要创建触发器的数据库,在数据库目录下选择要创建触发器的表,展开数据表,在数据表结点下右击"触发器",然后选择"新建触发器"
    实验七 触发器_第11张图片
    在此位置编写触发器的语句:
    实验七 触发器_第12张图片
    如下:
    实验七 触发器_第13张图片
    最后执行即可创建成功

    (2)查看触发器sc_insert 的内容。
    实验七 触发器_第14张图片
    实验七 触发器_第15张图片

    (3)删除触发器sc_insert。
    实验七 触发器_第16张图片

你可能感兴趣的:(SQL,Server,数据库,sql,database)