文档库 最新最全的文档下载
当前位置:文档库 › 数据库实验八:触发器及应用

数据库实验八:触发器及应用

数据库实验八:触发器及应用
数据库实验八:触发器及应用

数据库实验八:触发器及应用

一、实验目的与要求:

1.实验目的

(1)学习触发器的使用,加深对触发器功能和作用的理解。

(2)体会触发器执行的时机。

2.实验要求

建立如下的存储过程(基于前面实验建立的表和插入的数据,并为每个存储过程设计返回的状态值):

(1)为选课表分别建立插入和更新触发器,如果当前学生累计不及格门数达到5则给出警示信息。

(2)为课程表分别建立插入和更新触发器来建立约束规则:“专业基础”

课的教师必须为“教授”或“副教授”,如果不满足约束则拒绝操作,并给出错误信息。

(3)自行再分别设计2~3个触发器(在实验报告中要准确描述功能需求)。

(4)设计并执行相关的操作,体会DML触发器的效果和作用。

二、实验内容

1、实验原理

建立触发器的语句是:

CREATE TRIGGER [schema_name].trigger-name

ON {table |view}

FOR {INSERT | UPDATE | DELETE }

AS

[IF UPDATE (column) [{AND | OR} UPDATE (column)…]]

sql-statement

2、实验步骤与结果

(1)调出SQL Server2005软件的用户界面,进入SQL SERVER MANAGEMENT STUDIO。

\

(2)输入自己编好的程序。

(3)检查已输入的程序正确与否。

(4)运行程序,并分析运行结果是否合理和正确。在运行时要注意当输入不同的数据时所得到的结果是否正确。

(5)输出程序清单和运行结果。

(1)为选课表分别建立插入和更新触发器,如果当前学生累计不及格门数达到5则给出警示信息。

插入触发器:

create trigger xk_trigger

on选课

for insert

>

as

declare@amount int,@xh char(10)

select@xh=学号from inserted

if@xh is not null

begin

select@amount=(select count(*)from选课where成绩<60 and学号=@xh)

if@amount>=5

begin

raiserror('不及格达到5门',16,10)

end

end

]

insert into选课values('001','03','50')

insert into选课values('001','02','50')

insert into选课values('001','04','50')

更新触发器:

create trigger xk_trigger2

on选课

for update

as

^

declare@amount int,@xh char(10)

select@xh=学号from inserted

if@xh is not null

begin

select@amount=(select count(*)from选课where成绩<60 and学号=@xh) if@amount>=5

begin

raiserror('不及格达到5门',16,10)

end

end

[

update选课set成绩=50 where学号='001'and课程编号='02'

update选课set成绩=50 where学号='001'and课程编号='03'

update选课set成绩=50 where学号='001'and课程编号='04'

update选课set成绩=50 where学号='001'and课程编号='05'

update选课set成绩=50 where学号='001'and课程编号='06'

(2)为课程表分别建立插入和更新触发器来建立约束规则:“专业基础”课的教师必须为“教授”或“副教授”,如果不满足约束则拒绝操作,并给出错误信息。插入触发器:

create trigger kc_trigger3

on课程

for insert

as

declare@zc char(10),@zrjs char(10),@kcbh char(10),@kcxz char(10)

select@kcbh=课程编号,@zrjs=责任教师from inserted

if@kcbh is not null

begin

select@kcxz=课程性质from课程

select@zc=职称from教师where教师编号in

(select责任教师from课程where课程性质='专业基础')

if@zc!='教授'or@zc!='副教授'

"

begin

raiserror('该专业基础课的教师不是教师或副教授!',15,10)

rollback transaction

end

End

insert into课程values('09','TCP协议','2','8','专业基础')

更新触发器:

create trigger kc_trigger4

on课程

<

for update

as

declare@zc char(10),@zrjs char(10),@kcbh char(10),@kcxz char(10)

select@kcbh=课程编号,@zrjs=责任教师from inserted

if@kcbh is not null

begin

select@kcxz=课程性质from课程

select@zc=职称from教师where教师编号in

(select责任教师from课程where课程性质='专业基础')

if@zc!='教授'or@zc!='副教授'

begin

raiserror('该专业基础课的教师不是教师或副教授!',16,10)

rollback transaction

end

End

update课程set课程性质='专业基础'where责任教师='4'

三、实验分析与小结:

(实验过程中的问题分析、产生的原因以及解决方法;实验结果分析;有待优化思路)

1、实验过程中的问题分析、产生的原因以及解决方法。

-

2、实验结果分析;有待优化思路。

由于check约束只能引用定义了列级或表级约束的列,表间的任何约束都必须通过定义触发器来实现。在进行触发器的插入和更新操作的时候,其实可以两个放在一起执行,但想让自己在执行和修改程序时的方便,便分开来写。

四、其它

思考题:

1.为什么要使用触发器

2.触发器和游标的异同之处

答:

1、触发器是一种程序或是一种过程,它是事先设计好存储在数据库中的,是在某个特定条件发生时自动触发执行的,是提高数据库服务器性能的有力工具。

2、游标类似一个RecordSet,可以在SQL语句中依次遍历某个select的结果集的每行记录每个字段。触发器用来进行一些自动的数据库维护,比如在某张表发生变化的时候,自动在另外一个表里做上记录。

得分(百分制)

相关文档