第7章存储过程和触发器课件.ppt
《第7章存储过程和触发器课件.ppt》由会员分享,可在线阅读,更多相关《第7章存储过程和触发器课件.ppt(58页珍藏版)》请在三一办公上搜索。
1、第7章 存储过程和触发器,存 储 过 程,触 发 器,7 . 1 存 储 过 程,使用存储过程的优点如下:(1)存储过程在服务器端运行,执行速度快。(2)存储过程执行一次后,就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。(3)使用存储过程可以完成所有数据库操作,并可通过编程方式控制对数据库信息访问的权限,确保数据库的安全。(4)自动完成需要预先执行的任务。存储过程可以在SQL Server启动时自动执行,而不必在系统启动后再进行手工操作,大大方便了用户的使用,可以自动完成一些需要预先执行的任务。,7.1.1 存储过程的类型,在SQL
2、 Server 2008中有下列几种类型的存储过程。(1)系统存储过程。系统存储过程是由SQL Server提供的存储过程,可以作为命令执行。系统存储过程定义在系统数据库master中,其前缀是“sp_”,例如,常用的显示系统对象信息的sp_help系统存储过程,为检索系统表的信息提供了方便快捷的方法。(2)扩展存储过程。扩展存储过程是指在SQL Server 2008环境之外,使用编程语言(如C+语言)创建的外部例程形成的动态链接库(DLL)。使用时,先将DLL加载到SQL Server 2008系统中,并且按照使用系统存储过程的方法执行。扩展存储过程在 SQL Server 实例地址空间中
3、运行。但因为扩展存储过程不易撰写,而且可能会引发安全性问题,所以微软可能会在未来的SQL Server中删除这一功能,本书将不详细介绍扩展存储过程。(3)用户存储过程。在SQL Server 2008中,用户存储过程可以使用T-SQL语言编写,也可以使用CLR方式编写。在本书中,T-SQL存储过程就称为存储过程。,7.1.2 存储过程的创建与执行,1使用命令方式创建存储过程创建存储过程的语句是CREATE PROCEDURE或CREATE PROC,两者同义。语法格式:CREATE PROC | PROCEDURE 架构名. 过程名 ; 组号 /*定义过程名*/ 参数 类型架构名. 数据类型
4、/*定义参数的类型*/ VARYING = default OUT | OUTPUT READONLY/*定义参数的属性*/ , . WITH , . /*定义存储过程的处理方式*/ FOR REPLICATION AS ; . /*执行的操作*/ | EXTERNAL NAME 程序集名.类名.方法名 ; ,7.1.2 存储过程的创建与执行,1)命令主体CREATE PROCEDURE命令主体结构说明如下:(1)过程名:用于指定存储过程名,必须符合标识符规则,且对于数据库及所在架构必须唯一。(2);组号:为可选的整数,用于对同名的存储过程进行分组,以便使用一条DROP PROCEDURE语句
5、就可删除一组存储过程(3)参数:为存储过程的形参,符号作为第一个字符来指定参数名称。(4)数据类型:用于指定形参的数据类型,形参可为SQL Server 2008支持的任何类型,但cursor类型只能用于OUTPUT参数,如果指定参数的数据类型为cursor,则必须同时指定VARYING和OUTPUT关键字,OUT与OUTPUT关键字意义相同。(5)VARYING:指定作为输出参数支持的结果集。,7.1.2 存储过程的创建与执行,(6)default:指定存储过程输入参数的默认值,默认值必须是常量或NULL。(7)OUTPUT:指示参数为输出参数,输出参数可以从存储过程返回信息。(8)READ
6、ONLY:指定不能在存储过程的主体中更新或修改参数。(9):用于定义存储过程的处理方式。(10)FOR REPLICATION:用于说明不能在订阅服务器上执行为复制创建的存储过程,如果指定了FOR REPLICATION,则无法声明参数。(11)SQL语句:代表过程体包含的T-SQL语句,存储过程体中可以包含一条或多条T-SQL语句,除了DCL、DML与DDL命令外,还能包含过程式语句,如变量的定义与赋值、流程控制语句等。(12)EXTERNAL NAME:指定.NET Framework程序集的方法,以便CLR存储过程引用。,7.1.2 存储过程的创建与执行,2)过程选项的具体格式为: :=
7、 ENCRYPTION RECOMPILE EXECUTE AS 子句 (1)ENCRYPTION:指定SQL Server对CREATE PROCEDURE语句的原始文本进行加密。对于CLR存储过程,这个选项不可用。(2)RECOMPILE:指定数据库引擎不缓存该过程的计划,该过程在运行时编译。(3)EXECUTE AS子句:指定在其中执行存储过程的安全上下文。,7.1.2 存储过程的创建与执行,3)注意事项(1)用户定义的存储过程只能在当前数据库中创建(临时存储过程除外,它总是在系统数据库tempdb中创建)。存储过程名称存储在sysobjects系统表中,而语句的文本存储在syscomm
8、ents中。(2)SQL Server启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员在master数据库中创建,并在sysadmin固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。 (3)CREATE PROCEDURE的权限默认授予sysadmin固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员。sysadmin 固定服务器角色成员和 db_owner 固定数据库角色成员可以将CREATE PROCEDURE权限转让给其他用户。,7.1.2 存储过程的创建与执行,(4)SQL语句的限制。 如下语句必须使用对象的架构名对数据
9、库对象进行限定:CREATE TABLE、ALTER TABLE、DROP TABLE、TRUNCATE TABLE、CREATE INDEX、DROP INDEX、UPDATE STATISTICS及DBCC语句。 如下语句不能出现在CREATE PROCEDURE定义中:SETPARSEONLY、SETSHOWPLAN_TEXT、SETSHOWPLAN_XML、SETSHOWPLAN_ALL、CREATESCHEMA、CREATE FUNCTION、ALTER FUNCTION、CREATE PROCEDURE、ALTER PROCEDURE、CREATE TRIGGER、ALTER TR
10、IGGER、CREATE VIEW、ALTER VIEW、USE 数据库名等。,7.1.2 存储过程的创建与执行,2存储过程的执行通过EXECUTE或EXEC命令可以执行一个已定义的存储过程,EXEC是EXECUTE的简写。语法格式: EXEC | EXECUTE 返回状态 = 模块名 ;组号 | 模块名变量 参数名 = 值| 变量 OUTPUT | DEFAULT , . WITH RECOMPILE ; ,7.1.2 存储过程的创建与执行,1)语句说明(1)返回状态:为可选的整型变量,保存存储过程的返回状态。EXECUTE语句使用该变量前,必须对其声明。(2)模块名:要调用的存储过程或用户
11、定义标量函数的完全限定或者不完全限定名称。“组号”用于调用已定义的一组存储过程中的某一个。(3)模块名变量:局部定义的变量名,保存存储过程或用户定义函数的名称。(4)参数名:为CREATE PROCEDURE或CREATE FUNCTION语句中定义的参数名,“值”为实参。如果省略“参数名”,则后面的实参顺序要与定义时参数的顺序一致。(5)变量:为局部变量,用于保存OUTPUT参数返回的值。(6)DEFAULT:DEFAULT关键字表示不提供实参,而是使用对应的默认值。(7)WITH RECOMPILE:执行模块后,强制编译、使用和放弃新计划。,7.1.2 存储过程的创建与执行,2)注意事项存
12、储过程的执行要注意以下几点:(1)如果存储过程名的前缀为“sp_”,SQL Server会首先在master数据库中寻找符合该名称的系统存储过程。如果没能找到合法的过程名,SQL Server才会寻找架构名称为dbo的存储过程。(2)在执行存储过程时,若语句是批处理中的第一个语句,则不一定要指定EXECUTE关键字。,7.1.2 存储过程的创建与执行,3)举例(1)设计简单的存储过程。【例7.1】 返回081101号学生的成绩情况。该存储过程不使用任何参数。USE PXSCJGOCREATE PROCEDURE student_info AS SELECT * FROM CJB WHERE 学
13、号= 081101GO存储过程定义后,执行存储过程student_info:EXECUTE student_info如果该存储过程是批处理中的第一条语句,则可使用:student_info执行结果如图7.1所示。,7.1.2 存储过程的创建与执行,(2)使用带参数的存储过程。【例7.2】 从PXSCJ数据库的三个表中查询某人指定课程的成绩和学分。该存储过程接收与传递参数精确匹配的值。USE PXSCJGOCREATE PROCEDURE student_info1 name char (8), cname char(16) AS SELECT a.学号, 姓名, 课程名, 成绩, t.学分 F
14、ROM XSB a INNER JOIN CJB b ON a.学号 = b.学号 INNER JOIN KCB t ON b.课程号= t.课程号 WHERE a.姓名=name and t.课程名=cnameGO,7.1.2 存储过程的创建与执行,执行存储过程student_info1:EXECUTE student_info1 王林, 计算机基础执行结果如图7.2所示。,以下命令的执行结果与上面的相同:EXECUTE student_info1 name=王林, cname=计算机基础或者:DECLARE proc char(20)SET proc= student_info1EXECU
15、TE proc name=王林, cname=计算机基础,7.1.2 存储过程的创建与执行,(3)使用带OUPUT参数的存储过程。【例7.3】 创建一个存储过程do_insert,作用是向XSB表中插入一行数据。创建另外一个存储过程do_action,在其中调用第一个存储过程,并根据条件处理该行数据,处理后输出相应的信息。第一个存储过程:CREATE PROCEDURE dbo.do_insert AS INSERT INTO XSB VALUES(091201, 陶伟, 1, 1990-03-05, 软件工程,50, NULL);,7.1.2 存储过程的创建与执行,第二个存储过程:CREAT
16、E PROCEDURE do_action X bit, STR CHAR(8) OUTPUT AS BEGIN EXEC do_insert IF X=0 BEGIN UPDATE XSB SET 姓名=刘英, 性别=0 WHERE 学号=091201 SET STR=修改成功 END ELSE IF X=1 BEGIN DELETE FROM XSB WHERE 学号=091201 SET STR=删除成功 END END,7.1.2 存储过程的创建与执行,接下来执行存储过程do_action来查看结果:DECLARE str char(8)EXEC dbo.do_action 0, st
17、r OUTPUTSELECT str;执行结果如图7.3所示。,7.1.2 存储过程的创建与执行,(4)使用带有通配符参数的存储过程。【例7.4】 从三个表的连接中返回指定学生的学号、姓名、所选课程名称及该课程的成绩。该存储过程在参数中使用了模式匹配,如果没有提供参数,则使用预设的默认值。CREATE PROCEDURE st_info name varchar(30) = 李% AS SELECT a.学号,a.姓名,c.课程名,b.成绩 FROM XSB a INNER JOIN CJB b ON a.学号 =b.学号 INNER JOIN KCB c ON c.课程号= b.课程号 WH
18、ERE 姓名 LIKE nameGO 执行存储过程:EXECUTE st_info /*参数使用默认值*/或者:EXECUTE st_info 王% /*传递给name 的实参为王%*/,7.1.2 存储过程的创建与执行,(5)使用OUTPUT游标参数的存储过程。OUTPUT游标参数用于返回存储过程的局部游标。【例7.5】 在 PXSCJ数据库的XSB表上声明并打开一个游标。CREATE PROCEDURE st_cursor st_cursor cursor VARYING OUTPUT AS SET st_cursor = CURSOR FORWARD_ONLY STATIC FOR SE
19、LECT * FROM XSB OPEN st_cursor,7.1.2 存储过程的创建与执行,在如下的批处理中,声明一个局部游标变量,执行上述存储过程,并将游标赋值给局部游标变量,然后通过该游标变量读取记录。DECLARE MyCursor cursorEXEC st_cursor st_cursor = MyCursor OUTPUT/*执行存储过程*/FETCH NEXT FROM MyCursorWHILE (FETCH_STATUS = 0)BEGIN FETCH NEXT FROM MyCursorENDCLOSE MyCursorDEALLOCATE MyCursor,7.1.2
20、 存储过程的创建与执行,(6)使用WITH ENCRYPTION选项。WITH ENCRYPTION子句用于对用户隐藏存储过程的文本。【例7.6】 创建加密过程,使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。CREATE PROCEDURE encrypt_this WITH ENCRYPTION AS SELECT * FROM XSB通过系统存储过程sp_helptext可显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。执行如下语句:EXEC sp_helptext encrypt_
21、this结果集为提示信息“对象encrypt_this的文本已加密”。,7.1.3 存储过程的修改,使用ALTER PROCEDURE命令可修改已存在的存储过程并保留以前赋予的许可。语法格式:ALTER PROC | PROCEDURE 架构名. 过程名 ; 组号 参数 类型架构名. 数据类型 VARYING = default OUTPUT , . WITH , . FOR REPLICATION AS ; . | EXTERNAL NAME 程序集名.类名.方法名 ; ,7.1.3 存储过程的修改,【例7.7】 对例7.2中创建的存储过程student_info1进行修改,将第一个参数改成
22、学生的学号。USE PXSCJGOALTER PROCEDURE student_info1 number char(6),cname char(16) AS SELECT 学号, 课程名, 成绩 FROM CJB, KCB WHERE CJB.学号=number AND KCB.课程名=cnameGO,7.1.3 存储过程的修改,【例7.8】 创建名为select_students的存储过程,在默认情况下,该存储过程可查询所有学生信息,随后授予权限。当该存储过程需更改为能检索计算机专业的学生信息时,用ALTER PROCEDURE命令重新定义该存储过程。创建select_students存储
23、过程:CREATE PROCEDURE select_students /*创建存储过程*/ AS SELECT * FROM XSB ORDER BY 学号GO修改存储过程select_students:ALTER PROCEDURE select_students WITH ENCRYPTION AS SELECT * FROM XSB WHERE 专业= 计算机 ORDER BY 学号GO,7.1.4 存储过程的删除,当不再使用一个存储过程时,就要把它从数据库中删除。使用DROP PROCEDURE语句可永久地删除存储过程。在此之前,必须确认该存储过程没有任何依赖关系。语法格式:DROP
24、 PROC | PROCEDURE 架构名. 过程 , . 说明:过程是指要删除的存储过程或存储过程组的名称。USE PXSCJGOIF EXISTS(SELECT name FROM sysobjects WHERE name=student_info) DROP PROCEDURE student_info,7.1.5 界面方式操作存储过程,1创建存储过程例如,如果要通过图形向导方式定义一个存储过程来查询PXSCJ数据库中每个同学各门功课的成绩,那么其主要步骤如下:启动“SQL Server Management Studio”,在“对象资源管理器”中展开“数据库”“PXSCJ”,选择其中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 过程 触发器 课件

链接地址:https://www.31ppt.com/p-1824640.html