实验五 存储过程和触发器(参考预习)
实验5:存储过程和触发器
云南大学软件学院实验报告课程:数据库原理与实用技术实验学期:2014-2015学年第二学期任课教师:薛岗、朱艳萍专业:学号:姓名:成绩:实验5 存储过程和触发器一、实验目的(1)理解存储过程的概念、了解存储过程的类型(2)掌握创建存储过程的方法(3)掌握执行存储过程的方法(4)理解触发器的功能及工作原理。
(5)掌握创建、更改、删除触发器的方法。
二、实验内容1、使用不带参数的存储过程(1)创建一个存储过程,查询person表中所有不重复的职称。
(2)执行存储过程。
2、带输入参数的存储过程(1)创建一个存储过程,按照姓名查询person表中的员工信息。
(2)执行存储过程,查询名为黎明的员工数据3、带输入/输出参数的存储过程(1)创建一个存储过程,使其能够根据员工姓名,查询员工工资。
(考虑到员工不存在时给出提示信息)(2)执行存储过程4、使用触发器(1)创建一个触发器trig_update,返回对person进行更新操作后,被更新的记录条数(2)执行触发器(3)修改触发器trig_update,除返回被更新的记录条数外,再返回学生的所有基本信息5、使用触发器的两个特殊表:插入表(inserted)和删除表(deleted)。
(1)在person上创建触发器ins_del_sample,在插入、删除或更新操作后,分别从inserted表和deleted表中查询员工所有信息。
(请同学们在做删除操作时,注意备份)(2)执行触发器。
思考执行插入、删除和更新操作后返回的表有什么区别?6、使用系统存储过程查看触发器(与存储过程的使用类似)(1)显示触发器trig_update的一般信息(2)显示触发器trig_update的源代码(3)显示person上所有的依赖关系(4)显示触发器trig_update所引用的对象。
实验五 触发器及存储过程的使用
实验五触发器与存储过程
【实验目的】:①掌握触发器的使用
②掌握存储过程的使用
【实验内容】:相关命令写在作业本上。
1、建立银行业务数据库bankdb,其中,帐户信息表(bank)存放帐户的信息,交易信息表(transInfo)存放每次的交易信息。
(1)当向交易信息表(transInfo)中插入一条交易信息时,自动更新对应帐户的余额。
(2)当删除交易信息表时,要求自动备份被删除的数据到表backupTable中。
(3)跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示。
2、在学生成绩数据库中,利用存储过程,查询每门考试的平均分,若平均分大于85分,显示“优秀”,否则显示“较差”,并查询这门课中未通过考试的学生名单。
3、有程序员工资表prowage(id int,panme char(10),wage int),其中id是程
wage是工资。
创建一个存储过程,对程序员的工资进行分析,如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止。
存储过程执行完后,最终加了多少钱?每个人的工资为多少?
思考:如何修改上题的命令创建存储过程,要求查询程序员平均工资在4500元,如果不到,则每个程序员每次加200元,直到所有程序员平均工资达到4500元为止。
【实验答案】:1、(1)命令为:
(2)命令为:
(3)命令为:
2、命令为:
3、命令为:。
存储过程、函数与触发器操作答案
《存储过程、函数与触发器操作》实验一、实验目的与要求1、掌握存储过程的使用。
2、掌握函数的使用。
3、掌握触发器操作。
三、实验内容一、存储过程1、在“教务管理系统”数据库中创建一个名为ProcStudentInfo的存储过程,它返回学生的学号、姓名、性别、班级编号、年级和籍贯信息。
CREATE PROCEDURE Proc_StudentInfoASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息2、用EXECUTE执行Proc_StudentInfo存储过程。
EXECUTE Proc_StudentInfo3、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息。
CREATE PROCEDURE Proc_GetClassStudent1@ClassID varchar(14)ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassID4、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息,默认班级编号为'20031340000102' 。
CREATE PROCEDURE Proc_GetClassStudent2@ClassID varchar(14)= '20031340000102'ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDEXECUTE Proc_GetClassStudent2 '20031340000103'5、创建一个返回执行代码为100的存储过程。
CREATE PROCEDURE Proc_GetClassStudent4@ClassID varchar(14)ASBEGINSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDRETURN 100END6、执行存储过程Proc_GetClassStudent2和Proc_GetClassStudent4,并定义两个个变量存储执行返回代码。
实训4:存储过程和触发器
实训4:存储过程和触发器一、实训目的1、了解存储过程、触发器的概念。
2、会运用T-SQL语句创建存储过程、触发器。
2、掌握如何调用存储过程。
二、实训工具及设备1、实训软件:SQL Server。
2、实训设备:安装Windows系统计算机一台。
三、实训预备知识1、存储过程我们曾经学习过C语言的函数,使用函数时需要两步。
第一步:定义函数,它允许包含参数和返回值。
第二步:调用函数。
函数可以反复的调用,它方便了程序的模块化设计,大大提高了执行效率。
存储过程类似于C语言中的函数,它是存储在SQL SERVER服务器中的一组预编译过的SQL语句,当第一次调用以后,就驻留在内存中,以后调用时不必再进行编译,因此它的运行速度比独立运行同样的程序要快。
在SQL SERVER中存储过程分为两类:系统存储过程和用户自定义存储过程。
系统存储过程存储在master数据库中并以sp_为前缀(用户创建存储过程的时候不要以sp_为前缀),在任何数据库中都可以调用系统存储过程。
除了使用系统存储过程,用户还可以创建自己的存储过程。
当创建存储过程时,需要确定存储过程的三个组成部分:所有的输入参数及执行后的输出结果(返回值);∙返回给调用者的状态值,以指明调用是否成功。
使用T-SQL语句创建存储过程的语法格式如下:CREATE PROCEDUER 存储过程名[@参数1 参数的数据类型][=默认值] [OUTPUT],……[@参数n 参数的数据类型][=默认值] [OUTPUT]ASSQL语句其中:使用OUTPUT选项可将@参数的值返回给调用语句。
(1)创建不带参数的存储过程代码清单4-1:在选课系统(ElectiveSystem)数据库中创建每门选修课的平均分use ElectiveSystemgocreate procedure proc_courseAvgasselect courseName,avg(grade) as '平均成绩'from course,scwhere course.courseNo=sc.courseNogroup by course.courseNamego在查询分析器中调用存储过程proc_courseAvg,结果如下图4-1所示。
实验五触发器和存储过程
实验五:触发器和存储过程一、实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。
二、预习要求:存储过程和触发器的相关概念,事务的相关概念,编写相应的SQL语句。
三、实验内容:(一)为S表的删除操作定义一个触发器,在删除一个供应商记录时,将这个供应商的所有供应情况从spj表中删除。
(二)有一个小型的图书管理数据库,包含的表为:bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表borrowcard(cardid,ownername);--借书证表borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表写一个存储过程,实现借书操作,要求有事务处理。
(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。
(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。
(三)完成情况(附上设计的SQL语句)。
建立数据库:create database bookstoruse bookstorcreate table bookstore(bookid int,bookname char(20),bookauthor char(20),purchasedate char(20),stat char(6),primary key(bookid),Check(stat in('在库','不在库')),);create table borrowcard(cardid int primary key,ownername char(20),);create table borrowlog(cardid int,bookid int,borrowdate char(20),returndate char(20),primary key(cardid,bookid),foreign key(cardid)references borrowcard(cardid),foreign key(bookid)references bookstore(bookid),);存储过程:create procedure [dbo].[jieshu](@cardid int,@bookid int,@borrowdate char(20),@returndate char(20))asbegin transactioninsertinto borrowlogvalues(@cardid ,@bookid ,@borrowdate ,@returndate )if exists(select * from bookstore,borrowcard where bookid=@bookid and stat='在库'and cardid=@cardid)beginupdate bookstoreset stat='不在库'where bookid=@bookidcommit transactionendelsebeginif not exists(select*from bookstore where bookid=@bookid)print'不存在该书'if not exists(select*from borrowcard where cardid=@cardid)print'没有此用户'rollback transactionEnd查询语句:exec jieshu 1002062,1,'20121103','2012124'结果:触发器:create trigger storon borrowlogafter insertasif(new.borrowdate>new.returndate)print'失败,还书时间不应早于结束时间'beginrollback transactionend四、实验方法和步骤:(一)在查询分析器中编写实现上述功能的触发器,参考Create Trigger语法。
实验五 存储过程和触发器的使用
实验五存储过程和触发器的使用【目的要求】1、了解存储过程的基本概念和类型。
2、了解创建存储过程的T-SQL语句的基本语法。
3、了解查看、执行、修改和删除存储过程的T-SQL命令的用法。
4、了解触发器的基本概念和类型。
5、了解创建触发器的T-SQL语句的基本语法。
6、了解查看、修改和删除存储过程的T-SQL命令的用法。
【实验内容】内容一:存储过程的使用一、数据需求分析存储过程是一种数据库对象,为了实现某个特定任务,将一组预编译的SQL语句以一个存储单元的形式存储在服务器上,供用户调用,自动完成需要预先执行的任务。
存储过程在第一次执行时进行编译,然后将编译好的代码保存在高速缓存中便于以后调用,提高了代码的执行效率。
二、内容要点分析1、SQL SERVER支持五种类型的存储过程:系统存储过程、本地存储过程、临时存储过程、远程存储过程和扩展存储过程。
其中,系统存储过程是由系统提供的存储过程,可以作为命令执行各种操作。
系统存储过程定义在系统数据库master中,其前缀是sp_。
本地存储过程是指在用户数据库中创建的存储过程,这种存储过程完成特定数据库操作任务,不能以sp_为前缀。
2、只能在当前数据库中创建存储过程。
3、创建存储过程时,应指定所有输入参数和向调用过程或批处理返回的输出参数、执行数据库操作的编程语句和返回至调用过程或批处理以表明成功或失败的状态值。
4、创建存储过程的T-SQL语句CREATE PROC[EDURE] 存储过程名称[{ @参数名称数据类型 }] [,…n][WITH{ RECOMPILE|ENCRYPTION }]ASSQL语句序列说明:(1)RECOMPILE表明每次运行该过程时,将其重新编译。
(2)ENCRYPTION表示 SQL SERVER 加密SYSCOMMENTS表中包含CREATE PROCEDURE语句文本的条目。
注:必须将CREATE PROCEDURE语句放在单个批处理中。
5 实验五 创建存储过程和触发器
实验五创建存储过程和触发器
一、实验目的
1.通过对常用系统存储过程的使用,了解存储过程的类型;通过创建和执行存储过程,了解存储过程的基本概念,掌握使用企业管理器及查询分析器执行T-SQL语句创建存储过程。
2.通过创建触发器,了解触发器的基本概念,理解触发器的功能,掌握使用企业管理器及查询分析器执行T-SQL语句创建触发器。
二、实验要求
1.实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成实验内容的预习准备工作;
2.能认真独立完成实验内容;
3.实验后做好实验总结,根据实验情况完成总结报告。
三、实验学时
2学时
四、实验内容
1、使用sp_helptext查看byroyalty存储过程的文本,该存储过程在数据库pubs中。
2、在实验二创建的factory数据库中执行以下操作:
(1)创建一个为worker表添加职工记录的存储过程addworker。
执行并验证存储过程的正确性。
最后删除该存储过程。
(2)在depart表上创建一个触发器depart_update,当更改部门号时同步更改worker 表中对应的部门号。
执行并验证触发器的正确性。
最后删除该触发器。
(3)在worker表上创建一个触发器worker_delete,当删除职工记录时同步删除salary表中对应职工的工资记录。
执行并验证触发器的正确性。
最后删除该触发器。
数据库原理实验指导书(含触发器及存储过程)范文
数据库原理实验指导实验 1 SQL Server2000管理工具的使用一、目的与要求1.掌握SQL Server服务器的安装2.掌握企业管理器的基本使用方法3.掌握查询分析器的基本使用方法4.掌握服务管理器的基本使用方法5.对数据库及其对象有一个基本了解6.掌握用企业管理器和查询分析器创建数据库,修改数据库和删除数据库的方法。
二、实验准备1.了解SQL Server各种版本安装的软、硬件要求2.了解SQL Server支持的身份验证模式3.了解SQL Server各组件的主要功能4.对数据库、表和数据库对象有一个基本了解5.了解在查询分析器中执行SQL语句的方法三、实验内容1.安装SQL Server 2000 根据软硬件环境,选择一个合适版本的SQL Server 2000。
2.利用企业管理器访问系统自带的pubs数据库。
(1)启动SQL Server服务管理器。
通过“开始=>程序=>Microsoft SQL Server=>服务管理器”打开“SQL Server服务管理器”,启动“SQL Server服务管理器”,并记录当前运行的服务器名。
图1.1 启动SQL Server服务管理器(2)启动企业管理器。
通过“开始=>程序=>Microsoft SQL Server=>企业管理器”打开“SQL Server Enterprise Manager”图1.2 启动企业管理器(3)在企业管理器的树形目录中展开数据库,找到pubs并展开,则列出该数据库的所有对象,如表、视图、存储过程、默认和规则等。
(4)选中“表”,将列出pubs数据库的所有表(包括系统表和用户表),在此以用户表publishers为例,选中该表,单击鼠标右键,弹出快捷菜单,执行“打开表—返回所有行”菜单项,打开该表,查看其内容。
(5)在表的尾部插入记录(9943,zhang,Beijing,null,china)和记录(1408,li,shanghai,null,china)。
数据库实验存储过程、触发器和函数实验
存储过程、触发器和用户自定义函数实验实验内容一练习教材中存储过程、触发器和用户自定义函数的例子。
教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。
实验内容二针对附件1中的教学活动数据库,完成下面的实验内容。
1、存储过程(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。
执行存储过程:exec countpeople(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。
执行存储过程:exec avg_score'C602'(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。
执行存储过程:exec alterscore(4)创建一个存储过程,该存储过程有一个参数用来接收学生姓名,该存储过程查询该学生的学号以及选修课程的门数。
执行存储过程:exec select_courses'李强'(5)创建一个存储过程,该存储过程有两个输入参数用来接收学号和课程号,一个输出参数用于获取相应学号和课程号对应的成绩。
执行存储过程:declare@score smallintexec select_socre'98601','C602',@score outputprint'成绩是'+convert(char(2),@score)+'分'2、触发器(1)为study表创建一个UPDATE触发器,当更新成绩时,要求更新后的成绩不能低于原来的成绩。
创建完触发器尝试进行更新数据:update study set score=60 where sno='98601'and cno='C601'执行完之后查询结果发现成绩仍然是90select score from study where sno='98601'and cno='C601'再更新一个高于90分的成绩则可以成功update study set score=91 where sno='98601'and cno='C601'select score from study where sno='98601'and cno='C601'(2)为study表创建一个DELETE触发器,要求一次只能从study表中删除一条记录。
实验五 存储过程和触发器
实验五触发器、存储过程操作实验本实验需要2学时。
请大家先根据“触发器.doc”文档完成相关操作,再进行本次实验。
介绍完“存储过程”后,需上交本次实验报告。
一、实验目的(1)掌握SQL Server中的触发器的使用方法;(2)掌握存储过程的操作方法。
二、实验内容1. 创建、查看、修改和删除触发器。
2. 创建、查看、修改和删除存储过程。
三、实验方法1. 触发器的操作(1)建立触发器方法一:使用企业管理器首先,打开企业管理器,定位数据库并找到要创建触发器的表;然后,右击该表名,在弹出的快捷菜单中选择“设计表”,在打开的“设计表”窗口中单击按钮,打开如图1所示窗口。
图1 触发器属性窗口最后,在触发器属性窗口中输入触发器的内容,并单击“确定”按钮。
方法二:使用CREATE TRIGGER语句语法:CREATE TRIGGER <触发器名>ON { <表名> | <视图名>}{ FOR | INSTEAD OF | AFTER}{ [UPDATE] [,] [INSERT] [,] [DELETE]}AS<SQL 语句块>(2)查看触发器方法一:使用企业管理器方法二:使用T-SQL语句- sp_help <触发器名>- sp_helptext <触发器名>- sp_depends <触发器名>(3)修改触发器方法一:使用企业管理器方法二:使用ALTER TRIGGER语句语法:ALTER TRIGGER <触发器名>ON { <表名> | <视图名>}{ FOR | INSTEAD OF | AFTER}{ [UPDATE] [,] [INSERT] [,] [DELETE]} AS<SQL 语句块>(4)删除触发器方法一:使用企业管理器方法二:使用DROP TRIGGER语句语法为:DROP TRIGGER <触发器名>2. 存储过程的操作(1)建立存储过程方法一:使用建立存储过程向导方法二:使用企业管理器方法三:使用SQL语句(CREATE PROCEDURE)语法:CREATE PROC[EDURE] <存储过程名>[{@<参数名> <数据类型>}]AS {<SQL语句> | <语句块> }(2)查看存储过程方法一:使用企业管理器方法二:使用SQL语句(系统存储过程)- sp_help <存储过程名>- sp_helptext <存储过程名>- sp_depends <存储过程名>(3)修改存储过程方法一:使用企业管理器方法二:使用SQL语句(ALTER PROCEDURE)语法为:ALTER PROC[EDURE] <存储过程名>[{@<参数名> <数据类型>}]AS {<SQL语句>| <语句块> }(4)删除存储过程方法一:使用企业管理器方法二:使用DROP PROCEDURE语句语法为:DROP PROCEDURE <存储过程名>四、实验内容1、在学生表student上建立一个DELETE类型的触发器tr_delete,触发动作是显示信息“已删除学生表中的数据”。
存储过程和触发器(数据库实验5)
数据库基础与实践实验报告实验五存储过程和触发器班级:惠普测试142学号:**********姓名:***日期:2016-11-141 实验目的:1)掌握SQL进行存储过程创建和调用的方法;2)掌握SQL进行触发器定义的方法,理解触发器的工作原理;3)掌握触发器禁用和重新启用的方法。
2 实验平台:操作系统:Windows xp。
实验环境:SQL Server 2000以上版本。
3 实验内容与步骤利用实验一创建的sch_id数据库完成下列实验内容。
1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。
存储过程定义代码:CREATE PROCEDURE JSXX_PROCASSELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND o=o存储过程执行语句与执行结果截图:EXECUTE JSXX_PROC2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。
存储过程定义代码:CREATE PROCEDURE XM_PROC @sname VARCHAR(100)ASBEGINIF EXISTS(SELECT NULL FROM S WHERE sn=@sname)SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE o=o AND SC.sno=S.sno ANDS.sn=@snameELSEPRINT'无该姓名的同学。
'END运行截图:3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业),统计并显示该专业各年龄段男、女生人数。
如果没有该专业,则显示“无此专业”。
存储过程定义代码:CREATE PROCEDURE XBNL_PROC@departName VARCHAR(30)='计算机',@begin INT,@end INTASDECLARE @numOfBoys INTDECLARE @numOfGirls INTDECLARE @d# VARCHAR(3)DECLARE @result VARCHAR(50)BEGINSELECT @d# = dno FROM D WHERE dn=@departNameIF @d# IS NOT NULLBEGINSELECT @numOfBoys =COUNT(sno)FROM S WHERE age BETWEEN @begin AND @end AND dno=@d# AND sex='男'SELECT@numOfGirls =COUNT(sno)FROM S WHERE age BETWEEN@begin AND@end AND dno=@d# AND sex='女'SET @result = @departName+'专业年龄在'+CAST(@begin AS VARCHAR(3))+'-'+CAST(@end AS VARCHAR(3))+'之间的男生有'+CAST(@numOfBoys AS VARCHAR(3))+'人,'+'女生有'+CAST(@numOfGirls AS VARCHAR(3))+'人'ENDELSESET @result='无此专业。
SQL数据库实验五 存储过程和触发器
实验五存储过程和触发器
一、实验目的:
了解存储过程和触发器的组成结构及作用
熟悉存储过程和触发器的创建及使用
三、实验内容及要求
1. 2.
3.
4.CREATE PROCEDURE Stu_proc1 @SCLASS INT
AS SELECT奖学金=奖学金*1.1 FROM Student where奖学金<@JXJ
7.CREATE PROCEDURE Stu_proc4
@banj INT,@AVG decimal OUTPUT,@RS INT OUTPUT
AS SELECT @AVG=AVG(grade),@RS=COUNT(Student.Sno)
9.CREATE PROCEDURE Stu_proc6 @KCM Co,Student.sname,Elective.Grade from ElectiveSTUDENT INNER JOIN Elective ON Student.Sno=Elective.Sno WHERE o=@KCM
FROM STUDENT INNER JOIN ELECTIVE ON STUDENT.SNO=ELECTIVE.SNO
WHERE class=@banj
8.CREATE PROCEDURE Stu_proc5 @XM CHAR
AS SELECT o,Elective.grade from Elective STUDENT INNER JOIN Elective ON tudent.Sno=Elective.Sno WHERE Student.sname=@XM
AS SELECT * FROM Student WHERE CLASS=@SCLASS
数据库实验报告 之触发器和存储过程
(3)了解查看、执行、修改和删除存储过程的SQL语句的用法。
(4)了解查看、修改和删除触发器的SQL语句。
实验目的:
(1)掌握创建存储过程和触发器的方法和步骤。
(2)掌握存储过程和触发器的使用方法。
(3)掌握SQL Server 2005中数据库关系图的创建和管理。
③为S表创建一个名称为my_trig的触发器,当用户成功删除该表中的一条或多条记录时,触发器自动删除SC表中与之有关的记录。在S表中执行删除操作,验证触发器my_trig。
实验过程如下图所示:创建S表中的触发器:
验证触发器my_trig:
④创建一个名称为s_trig的触发器,当S表中的记录被更新时,显示表中所有的记录。验证触发器s_trig。
实验过程如下图所示:
验证触发器:
3.实验小结
实验总结:
(1)通过本次试验,对触发器和存储结构有了基本的了解,
(2)通过本次实验,了解了触发器的概念,掌握了触发器的创建及应用,存储过
程的创建及应用,查看触发器信息。
(3)对存储过程和触发器的使用方法以及SQL Server 2005中数据库关系图的创
建和管理。
实验步骤:在对象资源管理器窗口,点击可编程性,右击存储过程,点击新建存储过程,具体如下图所示:
④执行存储过程XSXK,查询“信息”系学生的学号、姓名、年龄、课程名、成绩。
实验步骤:在sql窗口输入如下代码:
exec xsxl ‘is’
点击执行,实验结果如下所示:
⑤使用系统存储过程查看存储过程XSXK的文本信息。
三:实验内容
(1)存储过程
①使用“学生-课程”数据库中的S表,创建一个不带参数的存储过程XS,查看学号为S1的学生的信息,包括该学生的学号、姓名、年龄。
数据库实验5 存储过程和触发器
实验五存储过程和触发器一、实验目的(1) 通过实践理解存储过程和触发器的概念、作用及优点;(2) 掌握存储过程的定义与调用,实现存储过程中带有不同参数的应用;(3) 掌握创建触发器。
二、实验原理1.存储过程一个被命名的存储在服务器上的T-SQL语句的集合,是封装重复性工作的一种方法。
(1)创建存储过程CREATE PROC[DURE]PROCDURE_NAME [{@PARAMENT DATA_TYPE}[VARYING][=DEFAULT][OUTPUT]] [, (1)AS SQL_STATEMENTPROCEDURE_NAME:新存储过程的名称,必须符合标识符规则且唯一。
@PARAMETER:过程中的参数。
可以声明一个或多个参数。
用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。
使用 @ 符号作为第一个字符来指定参数名称。
参数名称须符合标识符规则。
每个过程的参数仅用于该过程本身;相同的参数名称可用在其它过程中。
默认情况下参数只能代替常量,不能代替表名、列名或其它数据库对象名称。
DATA_TYPE:参数的数据类型。
DEFAULT:参数的默认值。
如果定义了默认值,不必指定该参数的值即可执行过程。
默认值必须是常量或 NULL。
OUTPUT:表明参数是返回参数。
该选项的值可以返回给 EXEC[UTE]。
使用 OUTPUT 参数可将信息返回给调用过程。
(2)执行存储过程SQL SERVER系统中,可以使用EXECUTE语句执行存储过程。
EXECUTE语句也可以简写为EXEC。
如果将要执行的存储过程需要参数,那么应该在存储过程名称后面带上参数值。
[EXEC[UTE]]{[@RETURN_STATUS=]{PROCEDURE_NAME[;NUMBER]|@PROCEDURE_NAME_VAR}[@PARAMETER={VALUE|@VARIABLE[OUTPUT]|[DEFAULT]}[,…N](3) 删除存储过程使用DROP PROCEDURE语句可永久地删除存储过程。
实验:存储过程与触发器
实验名称:存储过程与触发器实验目的:掌握SQLSERVER存储过程与触发器的定义、调用操作数据库结构关系:语法规定:(1)存储过程定义语法:CREATE PROC 过程名@parameter 参数类型……@parameter 参数类型outputASBegin命令块End利用TSQL调用存储过程:Execute 过程名[参数值,……][Output]如果没有参数,直接调用过程名(2)创建事后触发器的语法:CREATE TRIGGER 触发器名ON 表名For Insert [,Update,Delete] AsBegin命令块End(3)创建替代触发器的语法:CREATE TRIGGER 触发器名ON 表名Instead of Insert [,Update,Delete] AsBegin命令块End实验内容:(一)存储过程(1)创建带输入参数的存储过程,输入查询的工资范围,输出查询到的职工信息Create proc Myproc1@mingzint,@maxgzintasselect * from 职工表where 工资between @mingz and @maxgz 调用该过程execute Myproc1 1000,4000(2)使用Transact-SQL语言创建带输入输出参数的存储过程。
输入仓库号,输出该仓库的职工信息、职工最高工资、最低工资Create proc Myproc2@cangkuhaovarchar(50),@maxgzint output,@avggzint outputasbeginselect * from 职工表where 仓库号=@cangkuhaoSelect @maxgz=max(工资) from 职工表where 仓库号=@cangkuhaoSelect @avggz=avg(工资) from 职工表where 仓库号=@cangkuhaoEnd调用存储过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五存储过程、触发器的创建和使用一.实验目的:1)了解存储过程的概念2)了解使用存储过程的特点及用途3)掌握创建存储过程的方法4)掌握执行存储过程的方法5)了解查看、修改和删除存储过程的方法6)了解触发器和一般存储过程的主要区别7)了解使用触发器的优点8)掌握创建触发器的方法9)掌握查看触发器信息的方法10)了解删除触发器的方法二.实验准备1.熟悉存储过程的使用2.熟悉触发器的使用;三.实验要求1.在实验之前做好实验准备2. 完成数据库设计,并验收实验结果,提交实验报告四.实验内容实验内容及步骤:(一)存储过程的创建和使用例1:在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。
CREATE PROCEDURE StuInfoASSELECT SNO AS 学号,SNAME AS 姓名,SSEX AS 性别,SAGE AS 年龄,DNO AS 系号FROM SWHERE DNO=’D2’例2:创建存储过程StuScoreInfo,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。
程序清单:打开student数据库use mydb--查询是否已存在此存储过程,如果存在,就删除它if exists (select name from sysobjectswhere name =’StuScoreInfo’ and type= ‘P’)drop procedure StuScoreInfogo--创建存储过程creat proceure StuScoreInfoasselect student.sno as 学号,sname as 姓名,sex as 性别,ame as 课程名称,study.grade as 考试分数from student,course,studywhere student.sno=study.sno and o=o例3:创建一个带有参数的存储过程stu_info,该存储过程根据传入的学生编号,在t_student中查询此学生的信息。
程序清单:--删除已存在的存储过程if exists (select name from sysobjectswhere name = ‘stu_info’ and type =’P’)drop procedure stu_infogo--创建存储过程create procedure stu_info@sno varchar(8)asselectsno as 学号,sname as 姓名,sex as 性别,birthday as 出生日期polity as 政治面貌from studentwhere sno=@sno(二)执行存储过程的方法例1:执行前面例1中创建的StuInfo存储过程。
Use mydbExec StuInfo /*或者直接写存储过程的名称StuInfo*/注意:如果省略Exec关键字,则存储过程必须是批处理中的第一条语句,否则会出错。
例2:执行前面例2中创建的StuScoreInfo存储过程。
Use mydbExec StuScoreInfo例3:执行前面例3中创建的Stu_Info存储过程,该存储过程有一个输入参数“学号”,在执行时要传入一个学号值。
Use mydbExec Stu_Info ‘s1’或:Use mydbExec Stu_Info @sno=‘s1’例4:创建存储过程d_grade,根据指定的课程名(输入参数)返回该课程的最高分、最低分、平均分(输出参数)。
要求在创建存储过程前要先判断该存储过程是否已存在,如果存在,则将其删除。
(三)查看存储过程使用企业管理器,右击要查看的存储过程,在弹出的快捷菜单中选择“属性”选项,弹出“存储过程属性”对话框,在此对话框中可看到存储过程的源代码。
1.使用系统存储过程查看用户创建的存储过程:sp_help [[@objname=]name]用于显示存储过程的参数及其数据类型。
sp_helptext [[@objname=]name]用于显示存储过程的代码。
sp_depends [@objname=]’object’用于显示和存储过程相关的数据库对象。
(四)修改存储过程使用企业管理器中右击要查看的存储过程,在弹出的快捷菜单中选择“属性”选项,弹出“存储过程属性”对话框,在此对话框中可直接修改存储过程的代码。
1.使用T_SQl修改存储过程例1:修改前面创建的stu_info存储过程,使之完成以下功能:根据传入的学号,在表student,course,study中查询此学生的学号,姓名、性别、考试课程名称和考试分数。
Use mydbAlter procedure stu_info@sno varchar(10)asselect sname as 姓名,sex as 性别,ame as 课程名称,score as 考试成绩from student,course,studywhere student.sno=@sno and student.sno=study.sno and o=oexec stu_info ‘s1’(五)重命名存储过程1. 使用企业管理器,右击要操作的存储过程,在弹出的快捷菜单中选择“重命名”选项。
2.使用T_SQl修改存储过程sp_rename 原存储过程名称,新存储过程名称(六)删除存储过程3.使用SQL Server Management Studio 修改存储过程在SQL Server Management Studio 中,右击要操作的存储过程,在弹出的快捷菜单中选择“删除”选项。
4.使用T_SQl修改存储过程drop procedure {procedure} [,…n]触发器的创建和使用(一)触发器的创建例1:创建一个INSERT触发器,当在表student中插入一条新记录时,触发该触发器,并给出“你插入了一条新记录!”的提示信息。
在文本框中输入以下文本:CREATE TRIGGER Stu_Insert on [dbo].[student]FOR INSERTASDECLARE @msg char(30)SET @msg=”你插入了一条新记录!”print @msg例2:创建一个AFTER触发器,要求实现以下功能:在sc表上创建一个插入、更新类型的触发器scoreCheck,当在grade字段中插入或修改考试分数后,触发该触发器,检查分数是否在0~100之间。
Use studentif exists (select name from sysobjects where name = ‘scoreCheck’and type =’TR’)drop trigger scoreCheck/*创建触发器*/create trigger scoreCheckon scfor insert,updateasif update(score)print ‘AFTER触发器开始执行……’begindeclare @ScoreValue realselect @ScoreValue=(select score from inserted)if @ScoreValue>100 or @ScoreValue<0print ‘输入的分数有误,请确认输入的考试分数!’end创建了scoreCheck触发器之后,在T-SQL中输入以下SQL语句:use mydbprint ‘在sc中插入记录时触发器执行结果:’ /*在屏幕上显示引号中内容*/print ‘’ /*在屏幕上显示一空行*/insert into scvalues(‘s2’,’01’,-40) /*在屏幕上显示输入错误信息*/update scset score=123where sno=’s1’and cno=’1’ /*在屏幕上显示输入错误信息*/例3:创建一个INSTEAD OF触发器,要求实现以下功能:在course表上创建一个删除类型的触发器NotAllowDelete,当在c表中删除记录时,触发该触发器,显示“本表中的数据不允许被删除!不能执行删除操作!”的提示信息。
if exists (select name from sysobjectswhere name = ‘NotAllowDelete’ and type =’TR’)drop trigger NotAllowDelete/*创建触发器*/create triggerNotAllowDeleteon courseinstead of deleteasprint ‘INSTEAD OF触发器开始执行……’print ‘本表中的数据不允许被删除!不能执行删除操作!’测试NotAllowDelete触发器,在T-SQL中输入以下SQL语句:delete from course where cno=20030101’/*屏幕上显示NSTEAD OF触发器开始执行……*/例4:为course表创建一个INSERT触发器,当插入的新行中开课学分的值不是1~6时,就激活该出发器,撤销该插入操作,并使用RAISERROR语句返回一个错误信息。
CREATE TRIGGER tri_INSERT_KC ON COURSEFOR INSERTASDECLARE @开课学分 tinyintSELECT @开课学分=COURSE.creditFROM COURSE,InsertedWHERE COURSE.课程号= Inserted.课程号——如果新插入行的开课学分的值不是1~6,则撤销插入,并给出错误信息IF @开课学分 NOT BETWEEN 1 AND 6BEGINROLLBACK TRANSACTIONRAISERROR(‘开课学分的取值只能是1~6!’,16,10)END例5:为COURSE表再创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激活该触发器级联更新STUDY表中相关的课程号信息,并使用PRINT语句返回一个提示信息。
CREATE TRIGGER tri_UPDATE_KC ON COURSEFOR UPDATEASIF UPDATE(CNO) ――检测课程号列是否被更新BEGINDECLARE @原课程号char(3),@新课程号 char(3) ――声明变量――获取更新前后的课程号的值SELECT @原课程号=Deleted.课程号,@新课程号=Inserted.课程号FROM Deleted,InsertedWHERE Deleted.课程名=Inserted.课程名PRINT ‘准备级联更新STUDY表中的课程号信息…’——级联更新STUDY表中相关成绩记录的课程号信息UPDATE STUDYSET CNO=@新课程号WHERE CNO=@原课程号PRINT ‘已经级联更新STUDY表中原课程号’+@原课程号+’为’+@新课程号END(二)触发器的查看使用SQL Server Management Studio 查看查看触发器在企业管理器中右击要查看的表,从弹出的快捷菜单中选择“所有任务”│“管理触发器”选项,在“触发器属性”对话框中,从名称下拉列表框中选择要查看的触发器名称,在下面的文本框中就会显示该触发器的定义语句。