数据库实验 实验七 存储过程与触发器

注:此内容仅仅只是记录成长与分享学习,不能保证绝对正确

实验七 存储过程与触发器

实验日期: 2022 5 20 日  星期     实验地点:  宿舍  

一 实验目的

1. 掌握SQL Server中存储过程的创建和执行方法。

2. 理解触发器的功能,学会创建触发器,维护数据库完整性。

二 实验要求

1. 请大家务必动手完成实验,实验过程中,会随机抽查提问,作为实验成绩重要参考。

2. 请将数据库studb的两个基本文件自行保留,下次实验在此基础上进行。

3. 请在本实验报告指定方框认真填写对应的实验代码或实验结果。

三 实验内容

1. 创建用户存储过程,使用存储过程。

2. 创建触发器。

四 实验步骤

附加前述数据库,按下述要求完成实验:

1. 执行常见的系统存储过程

在命令窗口依次执行如下SQL命令:EXEC sp_databases;EXEC sp_tables;EXEC sp_columns S(查询当前数据库studb中数据表S的列的信息);EXEC sp_help S(查看数据表S的信息)。系统存储过程可通过图7.1方式查询,可自行练习执行其他的系统存储过程。

 

图7.1 系统存储过程

2. 通过SQL命令创建存储过程

1)创建不带参数的简单存储过程(get_S),该存储过程的功能是查询所有学生信息。完善并执行下述SQL命令。

CREATE PROCEDURE get_S

AS

SELECT  *  FROM   S  ;

创建好存储过程get_S之后,执行该存储过程的SQL命令为:

get_S;

2)创建带参数的存储过程(get_sc_name),该存储过程根据提供的学号、课程号,返回相应的学生姓名、课程名。完善并执行下述SQL命令:

CREATE PROCEDURE get_sc_name

@sno char(6),

@cno char(2),

@sname char(8)  output  ,

@cname varchar(24)  output   

AS

SELECT @sname=SNAME,@cname=CNAME

FROM S,C,SC

WHERE  S.SNO=SC.SNO  AND C.CNO=SC.CNO AND  SC.SNO=@sno  AND  SC.CNO

=@cno  ;

创建好存储过程get_sc_name之后,以学号'S1',课程号'C3'为参数,执行该存储过程的SQL命令为:

DECLARE @sname char(8),

                  @cname varchar(24)

EXEC get_sc_name 'S1','C3',@sname  output ,@cname  output ;

执行存储过程get_sc_name之后,通过SELECT显示执行结果:

SELECT @sname,@cname;

3. 通过SQL命令创建触发器

1)为数据表S创建一个名为Trig_S的触发器,将删除的学生数据备份到学生存档表SBACK中。

第一步,在studb数据表中创建一个与学生表S结构完全相同的学生备份表SBACK。

第二步,在S表中任意添加一个学生信息。

第三步,创建数据表S的触发器Trig_S:

CREATE TRIGGER  Trig_S ON   S

FOR    DELETE 

AS

INSERT INTO SBACK

SELECT    *   FROM   deleted  ;

第四步,删除第二步添加的学生信息,删除后查看数据表SBACK中是否已经备份了刚刚删除的学生信息。

2)为数据表SC创建一个名为Trig_SC_UPDATE_SCORE的触发器,在修改成绩表(SC)的成绩SCORE时,要求修改后的成绩一定不低于修改前的成绩(即临时表inserted中SCORE字段值大于等于临时表deleted中字段SCORE的值),否则回滚(ROLLBACK TRANSACTION)更新操作。完善并执行下页SQL命令。然后通过更新SC中的SCORE数值进行验证,可以看出,当更新后的SCORE不低于更新之前的SCORE时,能顺利通过,否则更新失败。

CREATE TRIGGER Trig_SC_UPDATE_SCORE ON    SC  

FOR UPDATE

AS

IF

(

         SELECT COUNT(*) FROM   inserted   ,  deleted

         WHERE     inserted.SCORE<deleted.SCORE 

)>0

ROLLBACK TRANSACTION

五 自选动作

请在下框填写除了上述实验内容之外自选的实验内容:

        创建AFTER触发器Trig_SC_INSERT_SCORE,实现在SC表中添加的成绩必须大于等于60,否则添加失败,回滚插入操作。

CREATE TRIGGER Trig_SC_INSERT_SCORE ON  SC      

FOR INSERT

AS

IF( SELECT SCORE FROM  inserted )<60

ROLLBACK TRANSACTION

测试:

insert SC

values('S0','C0',59)

结果为:

事务在触发器中结束。批处理已中止。

六 实验总结

        在做触发器实验的时候,我还不知道表inserteddeleted的存在,然后就一直在想,触发器是for类型的,也就是先进行删除,然后才进行备份,我想着不对劲啊,都先删除了还怎么备份啊,尝试了很久没有结果,也在百度上找了一下,都没有发现有deleted这张表的存在,最后无奈放弃了,跳过此题,开始读下一题,结果一读到括号里的内容瞬间就明白了,原来我是我露了一个知识点。

        后来在自选实验我还想尝试,假设不用表deletedFOR类型也不改,能不能做出来,网上查了触发器创建所有方式后发现其实也是可以的,只不过需要在触发器名字和 ON之间插入部分语句 BEFORE DELETE 然后其他的就可以实现了。

                                                                                                                 成绩              

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创业者-杨成淦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值