存储过程触发器.ppt
《存储过程触发器.ppt》由会员分享,可在线阅读,更多相关《存储过程触发器.ppt(98页珍藏版)》请在三一办公上搜索。
1、数据库原理与应用教程SQL Server,第10章 存储过程和触发器,在SQL Server 2008应用操作中,存储过程和触发器都扮演着相当重要的角色。存储过程可以使用户对数据库的管理工作变得更容易。存储过程是SQL语句和可选流程控制语句的预编译集合,它以一个名称存储并作为一个单元处理,能够提高系统的应用效率和执行速度。SQL Server提供了许多系统存储过程以管理SQL Server和显示有关数据库和用户的信息。,触发器是一种特殊类型的存储过程。当有操作影响到触发器保护的数据时,触发器就会自动触发执行。触发器是与表紧密联系在一起的,它在特定的表上定义,并与指定的数据修改事件相对应,它是一
2、种功能强大的工具,它可以扩展SQL Server完整性约束默认值对象和规则的完整性检查逻辑,实施更为复杂的数据完整性约束。本章主要介绍存储过程的基本概念,存储过程的创建、修改、调用和删除操作;触发器的基本概念,触发器的分类,触发器的创建、修改和删除,以及触发器的应用。,10.1 存储过程当开发一个应用程序时,为了易于修改和扩充,经常会将负责不同功能的语句集中起来而且按照用途分别独立放置,以便能够反复调用,而这些独立放置且拥有不同功能的语句,即是“过程”(Procedure)。SQL Server 2008的存储过程(Stored Procedure)包含一些T-SQL语句并以特定的名称存储在数
3、据库中。可以在存储过程中声明变量、有条件地执行以及其他各项强大的程序设计功能。,10.1.1 存储过程概述存储过程是一种数据库对象,独立存储在数据库内。存储过程可以接受输入参数、输出参数,返回单个或多个结果集以及返回值,由应用程序通过调用执行。存储过程是SQL Server中一个非常有用的工具。SQL Server支持存储过程和系统过程。存储过程是独立存在于表之外的数据对象。可以由客户调用,也可以从另一个过程或触发器调用,参数可以被传递和返回,出错代码也可以被检验。,存储过程最主要的特色是当写完一个存储过程后即被翻译成可执行码存储在系统表内,当作是数据库的对象之一,一般用户只要执行存储过程,并
4、且提供存储过程所需的参数就可以得到所要的结果而不必再去编辑T-SQL命令。一般来讲,应使用SQL Server中的存储过程而不使用存储在客户计算机本地的 T-SQL 程序,其优势主要表现在:,(1)允许模块化程序设计。只需创建一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员创建,并可独立于程序源代码而单独修改。如果业务规则发生变化,可以通过修改存储过程来适应新的业务规则,而不必修改客户端的应用程序。这样所有调用该存储过程的应用程序就会遵循新的业务规则。,(2)允许更快速地执行。如果某操作需要大量 T-SQL 语句或需重复执行,存储过程将比 T
5、-SQL 批处理代码的执行要快。创建存储过程时对其进行分析和优化并预先编译好放在数据库内,减少编译语句所花的时间;编译好的存储过程会进入缓存,所以对于经常执行的存储过程,除了第一次执行外,其他次执行的速度会有明显提高。而客户计算机本地的T-SQL 语句每次运行时,都要从客户端重复发送,并且在 SQL Server 每次执行这些语句时,都要对其进行编译和优化。,(3)减少网络流量。一个需要数百行 T-SQL 语句的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。(4)可作为安全机制使用。数据库用户可以通过得到权限来执行存储过程,而不必给予用户直接访问数据库对象的权限。这
6、些对象将由存储过程来执行操作,另外,存储过程可以加密,这样用户就无法阅读存储过程中的T-SQL语句。这些安全特性将数据库结构和数据库用户隔离开来,这也进一步保证数据的完整性和可靠性。With ENCRYPTION,10.1.2 存储过程的类型1.系统存储过程存储过程在运行时生成执行方式,其后在运行时执行速度很快。SQL Server 2008中的许多管理活动都是通过一种特殊的存储过程执行的,这种存储过程被称为系统存储过程。系统过程主要存储在master数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为数据库系统管理员管理SQL Server提供支持。通过系统存储过程,S
7、QL Server中的许多管理性或信息性的活动(如获取数据库和数据库对象的信息)都可以被顺利有效地完成。,尽管这些系统存储过程被存储在master数据库中,但是仍可以在其他数据库中对其进行调用,在调用时,不必在存储过程名前加上数据库名。而且当创建一个数据库时,一些系统存储过程会在新的数据库中被自动创建。SQL Server 2008系统存储过程是为用户提供方便的,它们使用户可以很容易地从系统表中提取信息、管理数据库,并执行涉及更新系统表的其他任务。,如果过程以SP_开始,又在当前数据库中找不到,SQL Server 2008就在master数据库中寻找。当系统存储过程的参数是保留字或对象名,且
8、对象名由数据库或拥有者名字限定时,整个名字必须包含在单引号中。一个用户可以在所有数据库中执行一个系统存储过程的许可权,否则在任何数据库中都不能执行系统存储过程。,2本地存储过程 本地存储过程也就是用户自行创建并存储在用户数据库中的存储过程,一般所说的存储过程指的就是本地存储过程。用户创建的存储过程是由用户创建并能完成某一特定功能(如查询用户所需的数据信息)的存储过程。,3临时存储过程 临时存储过程可分为以下两种:(1)本地临时存储过程不论哪一个数据库是当前数据库,如果在创建存储过程时,其名称以“#”号开头,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程。本地临时存储过程只有
9、创建它的连接的用户才能够执行它,而且一旦这位用户断开与SQL Server的连接,本地临时存储过程就会自动删除,当然,这位用户也可以在连接期间用DROP PROCEDURE命令删除他所创建的本地临时存储过程。,(2)全局临时存储过程不论哪一个数据库是当前数据库,只要所创建的存储过程名称是以两个“#”号开头,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程。全局临时存储过程一旦创建,以后连接到SQL Server 2008的任意用户都能执行它,而且不需要特定的权限。,当创建全局临时存储过程的用户断开与SQL Server 2008的连接时,SQL Server 2008将检查是
10、否有其他用户正在执行该全局临时存储过程,如果没有,便立即将全局临时存储过程删除;如果有,SQL Server 2008会让这些正在执行中的操作继续进行,但是不允许任何用户再执行全局临时存储过程,等到所有未完成的操作执行完毕后,全局临时存储过程就会自动删除。不论创建的是本地临时存储过程还是全局临时存储过程,只要SQL Server 2008停止运行,它们将不复存在。,4远程存储过程 在SQL Server 2008中,远程存储过程是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。5扩展存储过程扩展存储过程是用户可以使用外部程序语言(例如C语言)编写的存
11、储过程。显而易见,扩展存储过程可以弥补SQL Server 2008的不足,并按需要自行扩展其功能。扩展存储过程在使用和执行上与一般的存储过程完全相同,为了区别,扩展存储过程的名称通常以XP_开头。扩展存储过程是以动态链接库(DLL)的形式存在,能让SQL Server 2008动态地装载和执行。扩展存储过程一定要存储在系统数据库master中。,10.1.3 创建存储过程在SQL Server 2008中创建存储过程主要有两种方式:一种方式是在SQL Server Management Studio中创建存储过程;另一种方式是通过在查询窗口中执行T-SQL语句创建存储过程。1在SQL Ser
12、ver Management Studio中创建存储过程 在SQL Server Management Studio中创建存储过程的步骤如下:(1)打开SQL Server Management Studio,展开要创建存储过程的数据库,展开“可编程性”选项,可以看到存储过程列表中系统自动为数据库创建的系统存储过程。右键单击“存储过程”选项,选择“新建存储过程”命令,(2)出现创建存储过程的T-SQL命令,编辑相关的命令即可。(3)命令编辑成功后,进行语法检查,然后单击“!”按钮,至此一个新的存储过程建立成功。注意:用户只能在当前数据库中创建存储过程,数据库的拥有者有默认的创建权限,权限也可以
13、转让给其他用户。,2利用T-SQL语句创建存储过程SQL Server 2008提供了CREATE PROCEDURE创建存储过程。语法格式如下:CREATE PROC|PROCEDURE procedure_name;number parameter data_type VARYING=default OUT PUT,.n WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION,.n FOR REPLICATIONAS sql_statement.n,在创建存储过程时,应当注意以下几点。(1)存储过程最大不能超过128MB。(2)用户定义的存储过程只能在
14、当前数据库中创建,但是临时存储过程通常是在tempdb数据库中创建的。(3)在一条T-SQL语句中CREATE PROCEDURE不能与其他T-SQL 语句一起使用。,(4)SQL Server允许在存储过程创建时引用一个不存在的对象,在创建的时候,系统只检查创建存储过程的语法。存储过程在执行的时候,如果缓存中没有一个有效的计划,则会编译生成一个可执行计划。只有在编译的时候,才会检查存储过程所引用的对象是否都存在。这样,如果一个创建存储过程语句值要在语法上没有错误,即使引用了不存在的对象也是可以成功执行的。但是,如果在执行的时候,存储过程引用了一个不存在的对象,这次执行操作将会失败。,【例10
15、-1】在“教学库”创建无参存储过程,查询每个同学各门功课的平均成绩。即使没有输出参数也可返回内容,内嵌表值或多语句表值。USE 教学库GOCREATE PROCEDURE student_avgAS SELECT sno,avg(grade)as 平均分 FROM sc GROUP BY snoGO命令执行,创建存储过程成功,【例10-2】在教学库创建带参数的存储过程,查询某个同学的基本信息。USE 教学库GOCREATE PROCEDURE GetStudent number char(7)AS SELECT*FROM student WHERE sno=numberGO,【例10-3】在“
16、教学库”创建带参数的存储过程,修改某个同学某门课的成绩。USE 教学库GOCREATE PROCEDURE Update_score number char(7),cn char(4),score int AS UPDATE sc SET grade=scoreWHERE sno=number and cno=cn,【例10-4】使用流程控制语句,在“仓库库存”数据库创建存储过程,修改某商品的单价,如果库存总量大于某个值,就打九折。USE 仓库库存GOCREATE PROCEDURE Update_price number char(3),s floatAS IF(SELECT sum(数量)
17、FROM 库存情况 WHERE 商品编号=number)s UPDATE 商品 SET 单价=单价*0.9WHERE 商品编号=number,【例10-5】在“教学库”创建带有参数和默认值(通配符)的存储过程,从“学生表”中返回指定的学生(提供姓名)的信息。该存储过程对传递的参数进行模式匹配,如果没有提供参数,则返回所有学生的信息。USE 教学库GOCREATE PROCEDURE Student_Name name varchar(40)=%AS SELECT*FROM student WHERE sname LIKE nameGO,【例10-6】在教学库中创建带OUTPUT参数的存储过程,
18、用于计算指定学生的平均成绩,存储过程中使用一个输入参数(学号)和一个输出参数(平均成绩)。USE 教学库GOCREATE PROCEDURE Pname p_n varchar(20),aveage int OUTPUTASSELECT aveage=avg(grade)FROM sc WHERE sno=p_nGO,10.1.4 执行存储过程执行存储过程可以使用SQL Server Management Studio界面,也可以使用T-SQL 语句中的EXECUTE命令。1使用SQL Server Management Studio执行存储过程 在SQL Server Management
19、Studio中执行存储过程的步骤如下:(1)打开SQL Server Management Studio,展开存储过程所在的数据库,展开“可编程性”选项,右键单击存储过程名,如“教学库”中的“GetStudent”,在弹出的快捷菜单中选择“执行存储过程”命令(2)进入“执行过程”对话框,输入要查询的学生的学号,如“0100111”,2.使用T-SQL 语句执行存储过程如果存储过程是批处理中的第一条语句,那么不使用EXECUTE关键字也可以执行该存储过程。对于存储过程的所有者或任何一名对此过程拥有EXECUTE权限的用户,都可以执行此存储过程。如果需要在启动SQL Server时,系统自动执行存
20、储过程,可以使用sp_procoption进行设置。如果被调用的存储过程需要参数输入时,在存储过程名后逐一给定,每一个参数用逗号隔开,不必使用括号。如果没有使用参数名=default这种方式传入值,则参数的排列必须和建立存储过程所定义的次序对应,用来接受输出值的参数则必须加上OUTPUT。,EXECUTE可以简写为EXEC,如果存储过程是批处理中的第一条语句,那么可以省略EXECUTE关键字。对于以sp_开头的系统存储过程,系统将在master数据库中查找。如果执行用户自定义的sp_开头的存储过程,就必须用数据库名和所有者名限定。EXECUTE语句的语法格式为:EXECUTE return_s
21、tatus=procedure_name;numberparameter=value|parameter=variable OUTPUTWITH RECOMPILE,【例10-7】执行存储过程student_avg。EXECUTE student_avg【例10-8】执行带参数的存储过程GetStudent,查询学号为0100111的学生的基本信息。EXECUTE GetStudent 0100111【例10-9】执行修改成绩的存储过程Update_score。EXECUTE Update_score 0100111,C007,100【例10-10】执行修改单价的存储过程Update_pric
22、e。EXECUTE Update_price ds-018,20,【例10-11】执行带有参数和默认值(通配符)的存储过程Student_Name。(1)显示所有学生的信息:EXECUTE Student_Name(2)显示“王小明”所有学生的信息:EXECUTE Student_Name 王小明【例10-12】执行带有输入和输出参数的存储过程Pname。Declare avgage intEXECUTE Pname 冰箱,avgage OUTPUTPrint 冰箱的平均价格:+str(avgage),10.1.5 查看存储过程查看存储过程可以使用SQL Server Management S
23、tudio界面,也可以使用T-SQL 语句。1使用SQL Server Management Studio查看(1)打开SQL Server Management Studio,展开存储过程所在的数据库,展开“可编程性”选项,右键单击存储过程名,如“教学库”中的“GetStudent”,在弹出的快捷菜单中选择“编写存储过程脚本为”命令,再选择“CREATE到”,再选择“新查询编辑器窗口”(2)进入“查询编辑器”窗口,可以看到“CREATE PROCEDURE”代码,2使用T-SQL 语句查看存储过程可以执行系统存储过程sp_helptext,用于查看创建存储过程的命令语句;也可以执行系统存储过
24、程sp_help,用于查看存储过程的名称、拥有者、类型、创建时间,以及存储过程中所使用的参数信息。其语法格式分别为:sp_helptext 存储过程名称sp_help 存储过程名称【例10-13】查看存储过程Pname的相关信息。(1)sp_helptext Pname(2)sp_help Pname,10.1.6 修改和删除存储过程1修改存储过程可以在SQL Server Management Studio中;也可以通过T-SQL中的ALTER语句来完成。ALTER语句的语法格式如下:ALTER PROC|PROCEDURE procedure_name;number parameter d
25、ata_type VARYING=default OUT PUT,.n WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION,.n FOR REPLICATIONAS sql_statement.n,【例10-14】修改存储过程Pname,除了用于计算指定的商品的平均价格外,还用于计算此类商品的库存总数量,存储过程中使用一个输入参数(商品名)和两个输出参数(平均价格和总数量)。USE 仓库库存GOALTER PROCEDURE Pname p_n varchar(20),aveage int OUTPUT,sum int OUTPUTAS SELECT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 过程 触发器
链接地址:https://www.31ppt.com/p-6111371.html