实验八 存储过程和触发器_参考答案

合集下载

第8章 存储过程与触发器

第8章 存储过程与触发器

8.2.3 触发器创建
使用create trigger语句可以创建一个触发器 ,语法格式如下。 create trigger 触发器名 触发时间 触发事件 on 表名 for each row begin 触发程序 end
MySQL的触发事件有三种: insert:将新记录插入表时激活触发程序, 例如通过insert、load data和replace语句,可 以激活触发程序运行。
before表示在触发事件发生之前执行触发程 序。 after表示在触发事件发生之后执行触发器 。因此严格意义上讲一个数据库表最多可以 设置六种类型的触发器。
for each row表示行级触发器。 目前MySQL仅支持行级触发器,不支持语 句级别的触发器(例如create table等语句 )。for each row表示更新(insert、 update或者delete)操作影响的每一条记录 都会执行一次触发程序。
8.2.5触发器的使用 1、使用触发器删除数据
使用触发器可以实现多个表中相关联的数据同时删 除,以保证数据的完整性。例如,在“选课系统” 中,如果有课程的选修人数少于30人,那么学校决 定取消开设该课程。课程删除后,与该课程相关的 选课信息也应该被随之删除,即便是有学生已经选 修了该课程。可以通过触发器实现表的级联删除的 功能。 【例8.8】在choose数据库中,为student表创建触 发器,其作用是当有学生退学时,要删除该学生的 所有信息,包括基本信息和选课信息。
8.2.6 查看触发器的定义
可以使用下面四种方法查看触发器的定义。 1.使用show triggers命令查看触发器的定 义
可以使用下面四种方法查看触发器的定义。 2.查询information_schema数据库中的 triggers表,可以查看触发器的定义 MySQL中所有触发器的定义都存放在 information_schema数据库下的triggers表中, 查询triggers表,可以查看所有数据库中所有触 发器的详细信息,查询语句如下: select * from information_schema.triggers\G

存储过程及触发器实验报告

存储过程及触发器实验报告

数据库技术与应用实验报告七班级: 机械因材学号: 16 姓名:高永吉一:实验名称:存储过程及触发器二,实验目的:⑴使用系统常用的存储过程;⑵掌握存储过程的创建及应用(3) 理解触发器的概念;(4) 掌握触发器的创建及应用。

三.实验内容、过程与结果:存储过程1创建一个存储过程,查瞧学号为1(根据实际情况取)的学生的信息,包括该学生的学号,班级编号,姓名。

(提示:查询涉及到表Student)2执行1中创建的存储过程。

3使用输入参数创建题1中的存储过程。

题1中所创建的存储过程只能学号为1的学生信息进行查瞧,要想对其她学生进行查瞧,需要进行参数传递。

4执行3中创建的存储过程,(1)按位置传递参数;(2)通过参数名传递参数;5触发器1)在课程表Course上创建一个触发器,该触发器被操作DELETE所触发,且要求触发触发器的DELETE语句在执行被取消。

2)在表Student中建立插入触发器, 插入一条记录时,若年龄>100或者年龄<=0,拒绝插入记录并显示:“年龄不符合规定,无法插入此记录!”;3) 创建一个触发器,如果在Student表中添加或更改数据,向客户端显示一条消息“您正在插入或修改学生表的数据”,要求触发触发器的DELETE、UPDATE语句被执行。

4 )为Course表创建一个名称为my_trig的触发器,当用户成功删除该表中的一条或多条记录时,触发器自动删除Student表中与之有关的记录。

5 )使用系统存储过程查瞧创建的触发器。

图一:创建一个存储过程,查瞧Tno为1(根据实际情况取)的教师的信息,包括该教师的姓名,sal图二执行1中创建的存储过程。

图三使用输入参数创建题1中的存储过程。

图四执行3中创建的存储过程,(按位置传递参数)图五执行3中创建的存储过程通过参数名传递参数;图六使用系统存储过程查瞧3中创建的存储过程图七删除3中创建的存储过程。

图八在Teacher上创建一个触发器,该触发器被操作DELETE所触发,且要求触发触发器的DELETE语句在执行被取消。

存储过程和触发器(实验报告)

存储过程和触发器(实验报告)
CREATE PROCEDURE stu_en
WITH ENCRYPTION AS
SELECT*
FROM student_info
WHERE性别='男'
EXEC stu_en
DROP PROCEDURE stu_en
4.使用grade表。
(1)创建一个存储过程stu_g_r,当输入一个学生的学号时,通过返回输出参数获取该学生各门课程的平均成绩。
CREATE PROC stu_g_r @stu_no varchar(8)=NULL,
@stu_score real OUTPUT
AS
SELECT@stu_score=AVG(分数)
FROM grade
WHERE (学号=@stu_no)
(2)执行存储过程stu_g_r,输入学号0002。
DECLARE @score real
WHERE (a.姓名=@stu_name)
EXEC stu_g_p ‘刘卫平’
sp_helptext stu_g_p
3.使用student_info表。
(1)创建一个加密的存储过程stu_en,查询所有男学生的信息。
(2)执行存储过程stu_en,查看返回学生的情况。
(3)使用Transact-SQL语句DROP PROCEDURE删除存储过程stu_en。
(3)掌握通过SQL Server管理平台和Transact-SQL语句Alter procedure修改存储过程的方法;
(4)掌握通过SQL Server管理平台和Transact-SQL语句Drop procedure删除存储过程的方法;
(5)掌握通过SQL Server管理平台和Transact-SQL语句Create trigger创建触发器的方法和步骤;

数据库存储过程练习附答案

数据库存储过程练习附答案

存储过程、触发器练习1、在学生选课数据库中,创建一存储过程deptmale,查询指定系的男生人数,其中系为输入参数,人数为输出参数。

create proc p_dept@dept char(20),@mannum int outputasselect @allcre=count(sno) from studentwhere sdept=@dept and ssex='男'declare @num intexec p_dept '计算机系',@num outputprint @num2、在s_c数据库中,创建一个存储过程totalcredit,根据输入的学生姓名,计算其总学分。

(使用输出参数)。

并执行该存储过程。

create proc p_cou@name char(10),@allcre int outputasselect @allcre=sum(ccredit)from student,course,scwhere student.sno=sc.sno and o=oand sname=@name group by sc.snodeclare @asum intexec p_cou '刘晨',@asum outputprint @asum3、创建一更新触发器upd_grade,设置sc表的grade字段不能被更新,并显示信息“学生成绩不能被修改,请与教务处联系”。

CREATE TRIGGER mes_scON scFOR UPDATEASIF UPDATE(grade)BEGINROLLBACK TRANPRINT '学生成绩不能被修改,请与教务处联系'END4、创建一个insert触发器uninsertstu,当在student表中插入一条新纪录时,如果是“计算机系”的学生,则撤销该插入操作,并返回“此系人数已满,不能再添加”信息。

数据库存储过程练习附答案

数据库存储过程练习附答案

存储过程、触发器练习1、在学生选课数据库中,创建一存储过程deptmale,查询指定系的男生人数,其中系为输入参数,人数为输出参数。

create proc p_dept@dept char(20),@mannum int outputasselect @allcre=count(sno) from studentwhere sdept=@dept and ssex='男'declare @num intexec p_dept '计算机系',@num outputprint @num2、在s_c数据库中,创建一个存储过程totalcredit,根据输入的学生姓名,计算其总学分。

(使用输出参数)。

并执行该存储过程。

create proc p_cou@name char(10),@allcre int outputasselect @allcre=sum(ccredit)from student,course,scwhere student.sno=sc.sno and o=oand sname=@name group by sc.snodeclare @asum intexec p_cou '刘晨',@asum outputprint @asum3、创建一更新触发器upd_grade,设置sc表的grade字段不能被更新,并显示信息“学生成绩不能被修改,请与教务处联系”。

CREATE TRIGGER mes_scON scFOR UPDATEASIF UPDATE(grade)BEGINROLLBACK TRANPRINT '学生成绩不能被修改,请与教务处联系'END4、创建一个insert触发器uninsertstu,当在student表中插入一条新纪录时,如果是“计算机系”的学生,则撤销该插入操作,并返回“此系人数已满,不能再添加”信息。

实验八 存储过程

实验八  存储过程
(3)删除存储过程 删除存储过程stu_pr,方法步骤为: 3、利用查询分析器的对象浏览器中执行、编辑、删除存储过程。 (1)在对象浏览器中执行存储过程student_sc。 基本步骤:
执行结果: (2)编辑存储过程stu_pr,将该过程改为查询051班男生的所有资料。 基本步骤:
(3)删除存储过程stu_pr。 基本步骤:
2)创建一执行该存储过程的批处理,要求当总成绩当总成绩小于100时,显示信息为:某课 程名+“的总成绩为:“+总成绩,其总分未达100分。 大于100时,显示信息为:某课程名+“的总成绩为:“+总成绩。 T-SQL语句为:
(4)创建一个名为student_sc的存储过程,可查询出某段学号的同学的学号、姓名、总成
绩。(学号起始号与终止号在调用时输入,可设默认值)。 T-SQL语句为:
执行该存储过程的语句为:(试用多个语句进行测试) (5)创建带重编译及加密选项的存储过程
创建一个名为update_sc,并带重编译及加密选项的存储过程,可更新某号、某课程号 的学生的课程成绩。(学号、课程号由调用时输入) T-SQL语句:
执行存储过程的语句:
(2)创建带参数的存储过程 创建一个名为stu_proc1的存储过程,查询某系、某姓名的学生的学号、姓名、年龄,
选修课程名、成绩。系名和姓名在调用该存储过程时输入,其默认值分别为“%”与“林%”。 T-SQL语句:
执行存储过程的语句(用多种情况加以测试):
(3)创建带输出参数的存储过程 1)创建一个名为course_sum的存储过程,可查询某门课程考试的总成绩、考生人数。 总成绩可以输出,进一步加调用。 T-SQL语句:
(3)删除存储过程 将存储过程stu_pr删除掉。 T-SQL语句:

《数据库技术》项目8 存储过程和触发器

《数据库技术》项目8 存储过程和触发器

无论是局部临时存储过程还是全局临时存储过程, 只要SQL Server一停止运行,它们将不复存在。
5
项目准备

远程存储过程
远程存储程序是位于远程服务器上的存储过程。

扩展存储过程
扩展存储过程是用户可以使用外部程序语言编写的存储 过程,扩展存储过程通常以xp_开头。扩展存储过程是 以动态链接库的形式存在,能让SQL 动态的装载和执行。 扩展存储过程一定要放在系统数据库master中。
26
项目8.2 触发器
27
项目8.2 触发器
28
项目8.2 触发器
任务1:创建触发器 任务2:删除触发器 项目练习
29
任务1:创建触发器
提出任务
1.创建一个触发器student_tri1,当对xs表执行增加、删 除或修改操作时触发该触发器,输出字符串“该操 作已执行”。 2.在数据库student的表xs上建立一个名为student_tri2 的DELETE触发器,该触发器将实现对表xs中删除记 录的操作给出警报,并取消当前的删除操作。
按位置传送参数值
在执行存储过程的语句中,不参照被传递的参数和直接给 出参数的传递值。当存储过程中含有多个输入参数时,传 递值的顺序必须与存储过程中定义的输入参数的顺序相一 致。
20
任务3:执行存储过程
提出任务 1.执行不带参数的存储过程student_proc1。 2.执行带参数的存储过程student_proc2。 分析任务 按照相关的T-SQL命令执行存储过程。

允许模块化程序设计 较好的安全机制 有效的降低网络流量 更高的执行效率
3
项目准备
3.存储过程的类型

系统存储过程

数据库技术与应用实验八

数据库技术与应用实验八

实验8 存储过程和触发器1.实验目的(1)掌握通过SQL Server管理平台和Transact-SQL语句CREATE PROCEDURE 创建存储过程的方法和步骤。

(2)掌握使用Transact-SQL语句EXECUTE执行存储过程的方法。

(3)掌握通过SQL Server管理平台和Transact-SQL语句ALTER PROCEDURE 修改存储过程的方法。

(4)掌握通过SQL Server管理平台和Transact-SQL语句DROP PROCEDURE删除存储过程的方法。

(5)掌握通过SQL Server管理平台和Transact-SQL语句CREATE TRIGGER创建触发器的方法和步骤。

(6)掌握引发触发器的方法。

(7)掌握使用SQL Server管理平台或Transact-SQL语句修改和删除触发器。

(8)掌握事务、命名事务的创建方法,了解不同类型的事务的处理情况。

2.实验内容及步骤(1)在查询设计器中输入以下代码,创建一个利用流控制语句的存储过程letters_print,该存储过程能够显示26个小写字母。

CREATE PROCEDURE letters_printASDECLARE @count intSET @count=0WHILE @count<26BEGINPRINT CHAR(ASCII('a')+ @count)SET @count=@count +1END单击查询分析器的“执行查询”按钮,查看studentsdb数据库的存储过程是否有letters_print。

使用EXECUTE命令执行letters_print存储过程。

(2)输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名对应的学生的各科成绩。

CREATE PROCEDURE stu_info @name varchar(40)ASSELECT a.学号,姓名,课程编号,分数FROM student_info a INNER JOIN grade taON a.学号= ta.学号WHERE 姓名= @name使用EXECUTE命令执行存储过程stu_info,其参数值为“马东”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 实验八 存储过程和触发器 一、目的与要求 1. 正确理解存储过程和触发器的概念、功能和类型; 2. 掌握使用SSMS和T-SQL语句创建和管理存储过程和触发器。 二、上机准备 利用教师提供的XSGL数据库,该库中有3个表:student,course,sc。 三、实验内容 1. 将教师提供的XSGL数据库附加到本地数据库中。

2. 分别使用SSMS和T-SQL语句创建和管理存储过程和触发器。 (1)创建一个存储过程proc_stud_sc_info,查询学号、姓名、性别、系、课程号和成绩等信息。 use xsgl go create procedure proc_stud_sc_info as select student.sno,sname,sex,dept,cno,grade from student left join sc on student.sno=sc.sno go

(2)创建一个存储过程proc_stud_info,根据输入的学号,查询学生的基本信息。 use xsgl go create procedure proc_stud_info @sno char(5)='95001' as select * from student where sno=@sno go

(3)创建一个存储过程proc_stud_birth_year,根据输入的学生姓名,计算该学生的出生年份。 use xsgl go create procedure proc_stud_birth_year @sname varchar(6)='张立' as select sname,year(getdate())-age as 出生年份 from student where sname=@sname go 2

(4)创建一个存储过程proc_GetAvgScByCno,根据输入的课程号返回该课程的平均成绩。 use xsgl go create procedure proc_GetAvgScByCno @cno char(3)='1' as select @cno as 课程号,avg(grade) as 平均成绩 from sc where cno=@cno go 或

use xsgl go create procedure proc_GetAvgScByCno @cno char(3)='1',@aver smallint output as select @aver=avg(grade) from sc where cno=@cno go

(5)创建一个Insert触发器tri_StudentInsert,当向student表插入一条记录时,向客户端显示一条“您正在插入学生的数据”的信息。 create trigger tri_StudentInsert on student for insert as print '您正在插入学生的数据' go

--验证插入 --查看插入前状态 select * from student --执行插入 insert into student values('95006','范冰冰','f',35,'IS') --查看插入后状态 select * from student

(6)创建一个Update触发器tri_StudentUpdate,当修改student表的记录时,向客户端显示一条“原姓名与新姓名”的消息,并执行修改语句,验证触发器的运行。 create trigger tri_StudentUpdate on student for update as begin declare @oldname varchar(6),@newname varchar(6) select @oldname=sname from deleted select @newname=sname from inserted print '原姓名为:'+@oldname+space(3)+'新姓名为:'+@newname end go

--验证更新 --查看更新前状态 select * from student --执行更新 3

update student set sname='张小立' where sname='张立' --查看更新前状态 select * from student

(7)创建一个Delete触发器tri_StudentDelete,当学生表的数据删除时,该数据被自动地增加到毕业生表(需要新建)中,并删除student表中的数据,并返回毕业生表中的数据,验证触发器的操作。 --创建毕业生表 create table grad_student (sno char(5),sname varchar(6),sex char(1),age tinyint,dept char(2)) Go

--创建触发器 create trigger tri_StudentDelete on student for delete as begin declare @sno char(5),@sname varchar(6),@sex char(1),@age tinyint,@dept char(2) if exists(select * from Deleted) begin select @sno=sno,@sname=sname,@sex=sex,@age=age,@dept=dept from Deleted insert into grad_student values(@sno,@sname,@sex,@age,@dept) end end

go

--返回毕业生表中的数据,验证触发器的操作 delete from student where sname='范冰冰' select * from grad_student go

(8)创建一个Instead of触发器tri_ScInsert,当向sc表插入数据时,先检索student表和course表中是否有该同学以及该课程号的课程。如果没有,给出提示“学生表中没有该学号的同学!课程表中没有该课程号的课程”;有,则插入该数据,并执行插入语句测试触发器的动作。 create trigger tri_ScInsert on sc instead of insert as begin declare @sno char(5),@cno char(3),@grade tinyint select @sno=sno,@cno=cno,@grade=grade from inserted if (not exists(select sno from student where sno=@sno)) and (not exists(select cno from course where cno=@cno)) print '学生表中没有该学号的同学!课程表中没有该课程号的课程!' else if (exists(select sno from student where sno=@sno)) and (exists(select cno from course where cno=@cno)) begin insert into sc values(@sno,@cno,@grade) print '已成功插入!' end end

--插入数据,测试触发器的动作。 insert into sc values('95002','3',null) --成功插入数据 4

insert into sc values('95008','8',null) --显示“学生表中没有该学号的同学!课程表中没有该课程号的课程!”

3. 使用SSMS和T-SQL语句完成如下操作: (1)创建一个库存管理数据库,并添加如下三个基本表:

入库表 出库表 库存表 --创建数据库和3个表,并为库存表插入数据 create database 库存管理 on primary (name='库存管理',filename='h:\hyr\库存管理.mdf') log on (name='库存管理_log',filename='h:\hyr\库存管理_log.ldf') Go

use 库存管理 go create table 库存表 (商品名 varchar(20) primary key, 库存数量 int null) go create table 入库表 (入库号 int identity primary key, 商品名 varchar(20) null, 入库数量 int null, foreign key(商品名) references 库存表(商品名)) go create table 出库表 (出库号 int identity primary key, 商品名 varchar(20) null, 出库数量 int null, foreign key(商品名) references 库存表(商品名))

--为库存表插入数据 insert into 库存表 values('电视机',0)

相关文档
最新文档