实验八 存储过程和触发器_参考答案
- 格式:doc
- 大小:286.00 KB
- 文档页数:6
数据库技术与应用实验报告七班级: 机械因材学号: 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语句在执行被取消。
存储过程、触发器练习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表中插入一条新纪录时,如果是“计算机系”的学生,则撤销该插入操作,并返回“此系人数已满,不能再添加”信息。
实验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.声明一个字符串型的局部变量,并对其赋值:‘我的变量’,然后显示出此值。
declare @a char(10)set @a='我的变量'--select @a as 变量的值print @a2.编程实现如下功能:1)声明两个整形的局部变量:@i1和@i2,对@i1赋初值:10,@i2的值为:@i1乘以5,再显示@i2的结果值。
declare @i1 int,@i2 intset @i1=10set @i2=@i1*5print @i22)用While语句实现5000减1,减2,……一直减到50的计算,并显示最终的结果。
declare @sum int,@i intset @sum=5000set @i=1while(@i<=50)beginset @sum=@sum-@iset @i=@i+1endprint @sum3)输出100以内的素数。
declare @i smallint,@j smallint,@k smallintset @i=2while(@i<=100)beginset @k=0set @j=2while(@j<@i)beginif(@i%@j=0)beginset @k=1set @j=@Iendset @j=@j+1endif @k=0print @Iset @i=@i+1end4)将字符数在20以内的字符串变量C的值逆序输出。
要求输出界面为:declare @i varchar(20),@j int,@k varchar(20)set @i='jnbugswi'set @j=1set @k=''while @j<=len(@i)beginset @k=substring(@i,@j,1)+@kset @j=@j+1endprint '字符串C的值:'+@iprint 'C的逆序字符串:'+@k5)从SC表中查询所有学生的选课成绩情况,分别统计各分数段人数,并输出统计结果。
存储过程与触发器实验报告存储过程与触发器实验报告概述:本实验旨在探究数据库中存储过程与触发器的概念、作用以及使用方法。
通过编写实例代码并进行实验,深入理解存储过程与触发器在数据库管理系统中的重要性和应用场景。
一、存储过程存储过程是一组预定义的SQL语句集合,可以被多次调用。
存储过程通常用于执行一系列复杂的数据库操作,如数据的插入、更新、删除等。
它们可以被视为一种封装了业务逻辑的数据库对象,提供了更高效、更安全的数据处理方式。
在实验中,我首先创建了一个名为"AddEmployee"的存储过程,用于向员工表中插入新的员工信息。
该存储过程接受参数,包括员工姓名、性别、年龄等。
在存储过程中,我使用了INSERT INTO语句将参数值插入到员工表中。
通过调用该存储过程,可以方便地插入新员工的信息,减少了编写重复SQL语句的工作量。
二、触发器触发器是与数据库表相关联的特殊类型的存储过程,当表中的数据发生变化时,触发器会自动执行相应的操作。
触发器可以在数据的插入、更新、删除等操作前后触发,用于实现数据的自动验证、补充以及其他业务逻辑的处理。
在本次实验中,我创建了一个名为"UpdateStock"的触发器,用于在产品表中更新库存信息时自动更新库存变动记录表。
当产品表中的库存字段发生变化时,触发器会自动将相关信息插入到库存变动记录表中。
这样,无论是手动更新库存还是通过其他方式更新库存,库存变动记录都能够及时准确地被记录下来,方便后续的数据分析和追溯。
三、实验结果与总结通过本次实验,我深入学习了存储过程与触发器的概念、作用和使用方法。
通过编写实例代码并进行实验验证,我进一步认识到存储过程与触发器在数据库管理系统中的重要性和应用场景。
存储过程的使用可以提高数据库操作的效率和安全性,尤其适用于需要执行复杂业务逻辑的场景。
通过将一系列SQL语句封装成存储过程,可以减少网络传输的开销,提高数据库操作的性能。
第6章习题解答1.思考题(1)什么是存储过程?为什么要使用存储过程?答:存储过程是SQL Server服务器中一组(预编译)的T-SQL语句的集合,是存储在数据库中的程序,这些程序是用来完成对数据库的指定操作。
存储过程具有如下优点:1) 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2) 当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
这些操作,如果用程序来完成,就变成了一条条的SQL 语句,可能要多次连接数据库。
而使用存储过程,只需要连接一次数据库就可以了。
3) 存储过程可以重复使用,可减少数据库开发人员的工作量。
4) 安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
(2)系统存储过程和自定义存储过程有何区别?答:最简单的区别就是系统存储过程是系统自带的,用户不可更改删除;而自定义的存储过程是用户自己编辑的。
在自定义存储过程中可以调用系统存储过程。
(3)当某个表被删除后,该表上的所有触发器是否还存在?为什么?答:因为触发器(trigger)是SQL Server数据库中一种特殊类型的存储过程,不能由用户直接调用,而且可以包含复杂的T-SQL语句。
触发器是为表上的更新、插入、删除操作定义的,也就是说当表上发生更新、插入或删除操作时触发器将执行。
所以,当某个表被删除后,该表上的所有触发器将自动被删除。
触发器主要用于强制复杂的业务规则或要求。
(4)存储过程和触发器有什么区别?什么时候用存储过程?什么时候用触发器?答:存储过程和触发器,它们都是独立的数据库对象和存储在数据库上的特殊的程序。
存储过程由用户调用,完成指定的数据处理任务;触发器则由特定的操作触发,从而自动完成相关的处理任务。
(2版)数据库实验11存储过程触发器及答案数据库原理与应用实验实验十一存储过程与触发器一、实验目的及要求本实验主要目的是掌握存储过程的创建及使用方式、触发器的创建,具体要求有:●理解存储过程的概念及类型,深刻理解存储过程的优点。
●掌握创建各种存储过程的方法,掌握调用存储过程的方法。
●理解触发器的概念与类型。
●理解触发器的功能及工作原理。
●掌握创建、更改、删除触发器的方法。
●理解利用触发器维护数据完整性的方法。
二、实验原理及背景知识(一)存储过程知识存储过程是一种数据库对象,将执行计划存储在数据库服务器中。
它的运行速度比独立运行同样的程序要快。
1、存储过程类型(1)系统存储过程存储在master数据库中,其名称以sp_为前缀。
可以在其他数据库中调用。
(2)用户自定义存储过程由用户创建并能完成某一特定功能的存储过程,也称本地存储过程。
2、创建存储过程存储过程的三个组成部分:(1)所有的输入参数以及传给调用者的输出参数。
(2)被执行的针对数据库的操作语句,包括调用其他存储过程的语句。
(3)返回给调用者的状态值,以指明调用是成功还是失败。
3、T-SQL创建存储过程的基本语法格式CREATE PROC[EDURE] 存储过程名称参数定义AS SQL语句(二)触发器知识触发器是一种特殊类型的存储过程,主要通过事件进行触发执行的。
可以实现由主键和外键所不能保证的参照完整性和数据一致性;强化约束;跟踪变化;级联运行;存储过程的调用等功能。
1、触发器的种类(1)AFTER触发器:只有对表执行某一操作后,才能被触发。
可以为表的同一操作定义多个触发器,其触发次序可使用sp_settriggerorder来完成。
(2)INSTEAD OF触发器:不执行其触发操作,仅执行触发器本身,对同一触发操作只能定义一个INSTEAD OF触发器。
2、Inserted和Deleted临时表插入一行时,Inserted表保存了一份插入行的拷贝。
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)