实验六 存储过程和触发器

合集下载

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

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

存储过程及触发器实验报告实验目的:1、了解存储过程及其应用;2、了解触发器及其应用;3、掌握使用存储过程及触发器完成数据操作的方法。

实验过程:1、存储过程存储过程是指一组为了完成特定功能的SQL语句集合。

存储过程可以接收传入参数并返回处理结果。

存储过程的好处是可以减少网络流量,提高性能,增加安全性。

在本次实验中,我们将学习如何创建存储过程。

首先,在MySQL中打开MySQL Workbench,进入我们的实验数据库。

然后我们就可以创建一个存储过程了。

创建存储过程的语法如下:CREATE PROCEDURE procedure_name ()BEGIN-- SQL statementsEND;在这个语法中,procedure_name是我们想要创建的存储过程的名称。

在BEGIN和END 之间,我们可以输入一组SQL语句,这些语句将组成存储过程的主体内容。

我们可以以一个创建一个简单的存储过程作为例子,这个存储过程的作用是输出一条信息。

我们将这个存储过程命名为print_message。

在上面的语句中,我们定义了一个存储过程,它被命名为print_message。

它只包含一条SELECT语句,这条语句将输出Hello, World!这个字符串。

创建完存储过程之后,我们可以通过CALL语句来调用它:CALL print_message();执行这个语句后,我们将会看到Hello, World!这个字符串输出到屏幕上。

2、触发器触发器是一种被动的对象,它是由数据库管理系统在数据表上自动执行的一些操作。

当数据表中发生某些指定的操作时,触发器就会被调用执行。

触发器通常用于数据表中的数据变更操作,比如插入、更新和删除。

在本次实验中,我们将学习如何创建和使用触发器。

在MySQL中创建触发器的语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} trigger_event ON table_nameFOR EACH ROW trigger_body;在这个语法中,trigger_name是我们想要创建的触发器的名称。

第6章 存储过程和触发器

第6章 存储过程和触发器

6.2 触发器
触发器(trigger)是一些过程,与表关系密切, 用于保护表中的数据,当一个基表 被修改(INSERT、UPDATE或DELETE)时, 触发器自动执行,例如通过触发器 可实现多个表间数据的一致性和完整性。
触发器
触发器和应用程序无关。 例如,对于XSCJ数据库有XS表、XS_KC表 和KC表,当插入某一学号的学生某一课程 成绩时,该学号应是XS表中已存在的,课 程号应是KC表中已存在的。 可通过定义INSERT触发器实现上述功能。
6.2.1 利用SQL语句创建触发器
2. 创建触发器的限制 创建触发器有以下限制: (1) 代码大小。触发器代码大小必须小于32K。 (2) 触发器中有效语句可以包括DML语句,但不能包括DDL语句。 ROLLBACK、 COMMIT、SAVEPOINT也不能使用。但是,对于系统触发器(system trigger)可以使用 CREATE、ALTER、DROP TABLE和ALTER…COMPILE语句。 (3) LONG、LONG RAW和LOB的限制: ① 不能插入数据到LONG或LONG RAW; ② 来自LONG或LONG RAW的数据可以转换成字符型(如char、 varchar2),但是不能超过32K; ③ 使用LONG或LONG RAW不能声明变量; ④ 在LONG或LONG RAW列中不能使用:NEW和:PARENT; ⑤ 在LOB中的:NEW变量不能修改。 (4) 引用包变量的限制。如果UPDATE或DELETE语句检测到当前的 UPDATE冲突,则Oracle执行ROLLBACK到SAVEPOINT上并重新启 动更新,这样可能需要多次才能成功。
注意: 过程调用参数类型与个数必须完全一致;
OUT或IN OUT参数在调用时不能对应表达式; 例:JC(K+1,K);--正确 但JC(K+1,K*2);非法 参数表示对应表列时,最好%TYPE类型 过程调用只能出现在块中,不能与表达式计算 可以多个OUT参数来返回多个值。 IN参数在过程中不能赋值 如果要给参数赋值,必须指定为OUT或IN OUT 不指明IN、OUT或IN OUT时,缺省为IN 出错信息表USER_ERRORS(列:LINE,TEXT,..)

实验六管理存储过程11页word

实验六管理存储过程11页word

实验六存储过程与触发器一、存储过程【创建存储过程】:CREATE PROCEDURE [OWNER].[PROCEDURE NAME]AS <SQL块>如:Use pubsGoCreate procedure author_informationAsselect au_lname,au_fname,title,pub_namefrom authors ajoin titleauthor taon a.au_id=ta.au_idjoin titles ton t.title_id=ta.title_idjoin publishers pon t.pub_id=p.pub_idGo【管理存储过程】:➢可以使用sp_helptext命令查看创建存储过程的文本信息。

Use pubsGoSp_helptext author_informationGo➢可以用sp_help查看存储过程的一般信息。

Use pubsGoSp_help author_informationGo➢可以使用系统存储过程sp_rename修改存储过程的名字。

Use pubsGoSp_rename author_information ,authors_informationGo➢也可以使用企业管理浏览存储过程的信息,具体方法是:✧从树型结构上选中存储过程所在的数据库节点,展开该节点;✧选中数据库节点下的〖存储过程〗节点,则右边的列表列出了数据库中目前所有的存储过程;✧选中存储过程,右击,执行〖属性〗命令,则系统将弹出如图所示对话框。

✧可以在对话框中修改存储过程内容,并保存修改。

✧如果想知道某个表被存储过程引用的情况,可以使用sp_depends,Sp_depends authors✧如果想知道某个存储过程引用表的情况,则可以使用Sp_depends procedure_name【执行存储过程】:对于存储过程的调用,应使用EXECUTE或EXEC关键字。

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

存储过程和触发器(实验报告)
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.掌握存储过程的概念,了解存储过程的类型2.掌握创建各种存储过程的方法3.掌握执行存储过程的方法。

4.掌握查看,修改,删除存储过程的方法【实验内容】1.在SSMS图形化界面下创建对表Customers进行插入,修改和删除的3个存储过程:insertCustomers、updateCustomers、deleteCustomers.2.在查询分析其中创建一个存储过程,要求输入作者的姓和名,如果存在,则返回这个作者以及作者所出版的书的信息,否则给出相应的提示信息。

3.用系统存储过程查看刚创建的存储过程的信息。

4.删除存储过程【实验主要步骤】1.在SSMS图形化界面下创建对表Customers进行插入,修改和删除的3个存储过程:insertCustomers、updateCustomers、deleteCustomers.2.在查询分析其中创建一个存储过程,要求输入作者的姓和名,如果存在,则返回这个作者以及作者所出版的书的信息,否则给出相应的提示信息。

3.用系统存储过程查看刚创建的存储过程的信息。

4.删除存储过程实验二触发器的创建和使用【实验目的】1.理解触发器的概念与类型。

2.理解触发器的功能及工作原理。

3.掌握创建、修改和删除触发器的方法。

4.掌握利用触发器维护数据完整性的方法。

【实验内容】触发器是一种实施复杂数据完整性的特殊存储过程,在对表或视图执行UPDATE、INSERT、DELETE语句时自动触发执行,以防止对数据不正确、未授权或不一致的修改。

1.使用T-SQL语句创建一个DELETE触发器,完成的功能是当在Categories表中删除记录时,检测Products表中是否存在相关记录,如果存在,则给出提示信息“不能删除该条记录”;如果不存在,则删除该条记录。

2.基于Sales表创建一个触发器,针对INSERT、DELETE、UPDATE操作。

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

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

数据库技术与应用实验报告七班级:机械因材学号: 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语句在执行被取消。

存储过程、触发器和函数实验讲述

存储过程、触发器和函数实验讲述

存储过程、触发器和用户自定义函数实验实验内容一练习教材中存储过程、触发器和用户自定义函数的例子。

教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。

实验内容二针对附件1中的教学活动数据库,完成下面的实验内容。

1、存储过程(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。

(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。

(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。

(4)创建一个存储过程,该存储过程有一个参数用来接收学生姓名,该存储过程查询该学生的学号以及选修课程的门数。

(5)创建一个存储过程,该存储过程有两个输入参数用来接收学号和课程号,一个输出参数用于获取相应学号和课程号对应的成绩。

2、触发器(1)为study表创建一个UPDATE触发器,当更新成绩时,要求更新后的成绩不能低于原来的成绩。

(2)为study表创建一个DELETE触发器,要求一次只能从study表中删除一条记录。

(3)为course表创建一个INSERT触发器,要求插入的课程记录中任课教师不能为空。

3、用户自定义函数(1)创建一个返回标量值的用户定义函数 RectangleArea:输入矩形的长和宽就能计算矩形的面积。

create function RectangleArea(@a int,@b int)returns intasbeginreturn@a*@bend(2)创建一个用户自定义函数,功能为产生一张有关学生成绩统计的报表。

该报表显示每一门课程的课程号、课程名、选修人数、本门最高分、最低分和平均分。

调用这个函数,生成相应的报表并给用户浏览。

create function student_table()returns tableasreturn(select student_course.tcid课程号,ame课程名,COUNT(student_course.sno)选修人数,max(student_course.score)最高分,min(student_course.score)最低分,avg(student_course.score)平均分from student_course,coursewhere student_course.tcid=ogroup by student_course.tcid,ame)实验数据库说明教学活动数据库包括student、course和study三个基本表,三个基本表的结构说明和数据如下:(1)学生表(student)学生表的结构列名数据类型长度是否允许为空值字段说明sno char 5 NO 学号sname char 8 NO 姓名age smallint 年龄sex nchar 1 性别说明:sno为主键,age的范围为15~35之间,sex只能为“男”或“女”。

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

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

信息工程学院实验报告课程名称:《数据库原理》实验项目名称:存储过程与触发器一、实验目的:(1)了解存储过程的概念(2)掌握创建、执行存储过程的方法(3)了解查看、修改和删除存储过程的方法(4)了解触发器的概念(5)掌握创建触发器的方法(6)掌握查看、修改、删除触发器信息的方法二、实验设备与器件Win7 +Sql server 2008三、实验内容与步骤(一)存储过程运行实验四附录中的SQL语句,准备实验数据。

然后创建下列存储过程,并调试运行存储过程,查看运行结果。

1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。

CREATE PROCEDURE StuInfoASSELECT SNO AS学号,SNAME AS姓名,SSEX AS性别,SAGE AS年龄,DNO AS系号FROM studentWHERE DNO='D2'结果:stuinfo2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。

use mydb--查询是否已存在此存储过程,如果存在,就删除它if exists(select name from sysobjectswhere name='StuScoreInfo'and type='P')drop procedure StuScoreInfogo--创建存储过程CREATE PROCEDURE StuScoreInfoasselect student.sno as学号,sname as姓名,ssex as性别,ame as课程名称,study.grade as考试分数from student,course,studywhere student.sno=study.sno and o=o结果:StuScoreInfo3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。

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

实验六 存储过程和触发器(2学时)
1.实验目的
(1) 掌握通过SQL Server管理平台和Transact-SQL语句CREATE
PROCEDURE创建存储过程的方法和步骤。
(2) 掌握使用Transact-SQL语句EXECUTE执行存储过程的方法。
(3) 掌握通过SQL Server管理平台和Transact-SQL语句CREATE
TRIGGER创建触发器的方法和步骤。
(4) 掌握引发触发器的方法。
(5) 掌握事务、命名事务的创建方法,了解不同类型的事务的处理情况。

2.实验内容
(1) 输入以下T-SQL代码,创建一个利用流控制语句的存储过程
letters_print,该存储过程能够显示26个小写字母。

CREATE PROCEDURE letters_print
AS
DECLARE @count int
SET @count=0
WHILE @count<26
BEGIN
PRINT CHAR(ASCII('a')+ @count)
SET @count=@count +1
END

使用EXECUTE命令执行letters_print存储过程。
(2) 输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以

查询该姓名对应的学生的各科成绩。

CREATE PROCEDURE stu_info @name varchar(40)
AS
SELECT a.no,name,cno,grade
FROM Student a INNER JOIN grade b
ON a.no= b.sno
WHERE name= @name

使用EXECUTE命令执行存储过程stu_info,其参数值为“马东”。
如果存储过程stu_info执行时没有提供参数,要求能按默认值查询(设姓名
为“刘卫平”),如何修改该过程的定义?
(3) 使用student_db数据库中的Student表、course表、grade表。

① 创建一个存储过程stu_grade,查询学号为0001的学生的姓名、课程名称、
分数。
② 执行存储过程stu_grade,查询0001学生的姓名、课程名称、分数。

③ 使用系统存储过程sp_rename将存储过程stu_grade更名为stu_g。
(4) 使用Student表、course表、grade表。
① 创建一个带参数的存储过程stu_g_p,当任意输入一个学生的姓名时,将
从3个表中返回该学生的学号、选修的课程名称和课程成绩。

② 执行存储过程stu_g_p,查询“张卫民”的学号、选修课程和课程成绩。
③ 使用系统存储过程sp_helptext,查看存储过程stu_g_p的文本信息。

(5) 输入以下代码,复制Student表命名为stu2,为stu2表创建一个触发
器stu_tr,当stu2表插入一条记录时,为该记录生成一个学号,该学号为学号列
数据的最大值加1。

--复制Student表命名为stu2
SELECT * INTO stu2 FROM Student
GO
--为stu2表创建一个INSERT型触发器stu_tr
CREATE TRIGGER stu_tr
ON stu2 FOR INSERT
AS
DECLARE @max char(4)
SET @max=(SELECT MAX(no) FROM stu2)
SET @max=@max+1
UPDATE stu2 SET no=REPLICATE('0',4-len(@max))+@max
FROM stu2 INNER JOIN inserted on stu2.no=inserted.no

执行以上代码,查看studentsdb数据库中是否有stu2表,展开stu2,查看其
触发器项中是否有stu_str触发器。
在查询编辑窗口输入以下代码:

INSERT INTO stu2(no,name,sex) VALUES('0001','张主','女')
运行以上代码,查看stu2表的变化情况,为什么插入记录的学号值发生了改
变?
(6) 为grade表建立一个名为insert_g_tr 的INSERT触发器,当用户向

grade表中插入记录时,如果插入的是在course表中没有的课程编号,则提示用
户不能插入记录,否则提示记录插入成功。在进行插入测试时,分别输入以下数
据:
学号 课程编号 分数
0004 0003 76
0005 0007 69
观察插入数据时的运行情况,说明为什么?
create trigger insert_g_tr
on grade for insert
as
begin
declare @sno varchar(50),@cno varchar(50),@grade int
select @cno=cno,@sno=sno,@grade=grade from inserted
if not exists (select * from course where no=@cno)
print '没有该课程编号,不能插入记录'
else
insert into sc values(@sno,@cno,@grade)
end
(7) 为course表创建一个名为del_c_tr的DELETE触发器,该触发器的

作用是禁止删除course表中的记录。
create trigger del_c_tr
on course instead of delete
as
begin
declare @cno varchar(50)
select @cno=no from deleted
if exists (select * from course where no=@cno)
print 'grade表中有记录,不能删除记录'
else
delete from course where no=@cno
end

(8) 为Student表创建一个名为update_s_tr的UPDATE触发器,该触发

器的作用是禁止更新Student表中的“姓名”字段的内容。
create trigger update_s_tr
on student instead of update
as
begin
declare @oldsno varchar(50),@newsno varchar(50)
if update(no)
select @oldsno=no from deleted
select @newsno=no from inserted
if exists (select * from grade where sno=@oldsno)
print '禁止修改'
else
update student set no=@newsno where no=@oldsno
end
(9) 使用Transact-SQL语句DROP TRIGGER删除update_s_tr触发器。
DROP TRIGGER update_s_tr

相关文档
最新文档