实验七 触发器

实验七 触发器,第1张

一.实验目的

(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_modify2

update 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。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/991686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存