数据库实验第三章--触发器

数据库实验第三章–触发器

一、实验题目

数据库专题训练实验-------触发器

二、实验目的和要求

掌握触发器的分类及工作原理。
掌触发器的创建方法。
掌握触发器的使用方法。

三、实验步骤

题目一:创建一个名为 tri_Delete_C的触发器,测试该触发器的执行情况,并给出出实验结果。该触发器的作用为:当在课程表C中删除某门课程时,则所有选修该课程的记录也全部删除。

代码:

CREATE TRIGGER tri_Delete_C ON C
AFTER DELETE
AS
DELETE FROM SC
WHERE SC.Cno IN (SELECT Cno FROM DELETED)

运行程序:

delete
From C
where Cno=‘C5’

题目二:创建一个名为tri_Insert_S的触发器,测试该触发器的执行情况,并给出实验结果。当插入的新记录中Sage的值不是18至25之间的数值时,就激活该触发器,撤销该插入操作,并给出错误提示。

代码:

CREATE TRIGGER tri_Insert_S ON S
For Insert,UPDATE
AS
if exists(select* from inserted where (Sage<18 or Sage>25))
begin
print ‘Sage不满足条件,无法插入’
rollback
End

运行程序:

–运行程序1

insert into S
values
(‘S8’,‘徐小铎’,‘男’,‘28’,‘计算机’)

–运行程序2

insert into S
values
(‘S9’,‘河马’,‘男’,‘11’,‘计算机’)

–运行程序3

insert into S
values
(‘S10’,‘大象’,‘女’,‘20’,‘计算机’)

题目三:创建一个名为tri_Update_SC的触发器,要求:(1)首先判断数据库中是否已经存在名为tri_Update_SC的触发器,如果存在,首先删除,再创建。(2)当试图修改SC表中的学生成绩时,给出不能随便修改成绩的信息提示。

代码:

use XSCJ
IF EXISTS (SELECT name FROM sysobjects
WHERE name = ‘tri_Update_SC’ AND type = ‘TR’)
DROP TRIGGER tri_Update_SC
go

CREATE TRIGGER tri_Update_SC ON SC
For insert,delete,update
AS
print ‘不能随便修改成绩!’
rollback

检验代码:

insert into SC
values
(‘S9’,‘C9’,‘99’)

题目四:使用系统存储过程sp_help,sp_helptext,sp_helptrigger查看触发器相关信息。给出显示结果。

sp_help:

代码:

use XSCJ
go
sp_help tri_Delete_C

sp_helptext:

代码:

use XSCJ
go
sp_helptext tri_Delete_C

sp_helptrigger:

代码:

use XSCJ
go
exec sp_helptrigger SC

题目五:禁用tri_Update_SC触发器,并演示禁用该触发器后Update的执行情况。

代码:

alter table SC disable trigger tri_Update_SC

测试代码:

use XSCJ
go
insert into SC
values
(‘S9’,‘C9’,‘99’)

题目六:在SC表上创建一个instead of类型的触发器,触发器名称为:tri__Insert_SC。实现:当向表SC插入记录时检查分数的合理性,分数必须在0到100之间,如果不合理就拒绝插入,并给出信息提示

代码:

use XSCJ
IF EXISTS (SELECT name FROM sysobjects
WHERE name = ‘tri_Insert_SC’ AND type = ‘TR’)
DROP TRIGGER tri_Insert_SC
go

create trigger tri_Insert_SC on SC
instead of insert
as
if exists(select * from inserted
where (Score>0 and Score<=100))
begin
insert into SC
select * from inserted
print’插入成功’
end
else
begin
rollback
print’分数插入异常,请您重复检查’
end

检测代码:

(Score=99满足条件)

use XSCJ
go
insert into SC
values
(‘S9’,‘C9’,‘99’)

(Score=-2不满足条件)

use XSCJ
go
insert into SC
values
(‘S9’,‘C9’,’-2’)

(Score=102不满足条件)

use XSCJ
go
insert into SC
values
(‘S9’,‘C9’,‘102’)

题目七:创建一个名为tir_Update_S的触发器,实现:当学生基本表S中的学号Sno发生变化时,SC选课记录中对应的学号也发生改变。并通过测试数据验证该触发器的执行情况。

代码:

use XSCJ
go

if exists(select name from sysobjects
where name=‘tir_Update_S’ and type=‘TR’)
drop trigger tir_Update_S
go

create trigger tir_Update_S on S
after update
as
declare @old varchar(10) ,@new varchar(10)
select @old=Sno from deleted
select @new=Sno from inserted
if(update(Sno))
begin
update SC
set SC.Sno=@new
where SC.Sno=@old
end
else
rollback

测试代码:

update S
set Sno=‘S9’
where Sno=‘S10’

题目八:创建一个名为tri_Delete_C 的触发器,实现:删除一门课程时候,首先判断该课程有否有人选,如果有人选,则不能删除并通过测试数据验证该触发器的执行情况。

代码:

use XSCJ
go
if exists(select name from sysobjects
where name='tri_Delete_C ’ and type=‘TR’)
drop trigger tri_Delete_C
go

create trigger tri_Delete_C
on C
instead of delete
as
if (exists(select * from SC,deleted
where SC.Cno=deleted.Cno))
begin
print’课程被选,无法删除’
rollback
end
else
begin
delete from C where Cno in(select Cno from deleted)
End

测试代码:

use XSCJ
insert into C
values
(‘C6’,‘Linux’,‘小路’)

delete
from C
where Cno=‘C4’

delete
from C
where Cno=‘C6’

测试代码解释:

测试代码分为了三个部分,第一个是创建一个没有学生选课的课程(编号C6,名称LINUX,教师小路)然后通过两个测试代码对触发器tir_Delete_C进行测试;第一个测试代码:在SC中已经被选课的C4,预期会触发条件,产生“课程被选,无法删除”的提示;第二个测试代码,因为在SC中没有学生选课,所以可以顺利删除。

四、实验结果及实验总结

通过本次实验,对触发器的学习,感觉对数据库整体编程的操作多了一类方法方案,拓宽了对于数据库编程的眼界。受益匪浅。其实我实际感觉数据库编程不管是之前学习的基础编程还是本学期学习的上一节的存储过程以及这节的触发器,编程都是存在共性,可以举一反三,通过多次实践,对数据库的理解也不断的加深。

你可能感兴趣的:(sql,server)