




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 存储过程与触发器,教学目标:存储过程和触发器是由一系列的Transact-SQL语句组成的子程序,用来满足更高的应用需求,触发器也是一种存储过程,它是一种在基本表被修改时自动执行的内嵌过程,它主要是通过事件进行触发而被执行,而存储过程可以通过存储过程的名字被直接调用,它们可以说是SQL Server程序设计的灵魂,掌握和使用好它们对数据库的开发与应用非常重要。 教学提示:通过本章的学习,要求掌握存储过程、触发器的概念、用途、创建、修改等管理和操作,能编写简单的存储过程,要求熟练运用INSERT触发器、UPDATE触发器和DELETE触发器。,第8章 存储过程与触发器,拥有不同功能的语句,即是“过程”(Procedure)。SQL Server 2005的存储过程包含一些Transact-SQL语句并以特定的名称存储在数据库中(存储过程也是一种数据库对象) SQL Server 2005的存储过程与其他程序设计语言的过程类似,同样能按下列方式运行: (1) 它能够包含执行各种数据库操作的语句,并且可以调用其他的存储过程。 (2) 能够接受输入参数,并以输出参数的形式将多个数据值返回给调用程序(Calling Procedure)或批处理(Batch)。 (3) 向调用程序或批处理返回一个状态值,以表明成功或失败(以及失败的原因)。 (4) 存储过程(Stored Procedures)是一组为完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字给出参数(如果该存储过程带有参数)来执行它。,存储过程概述,第8章 存储过程与触发器,1系统存储过程 存储过程在运行时生成执行方式,其后在运行时执行速度很快 系统存储过程(System Stored Procedures)主要存储在master数据库中,并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理SQL Server 2005提供支持 2本地存储过程 本地存储过程(Local Stored Procedures)也就是用户自行创建并存储在用户数据库中的存储过程。事实上一般所说的存储过程指的就是本地存储过程。 3临时存储过程 临时存储过程(Temporary Stored Procedures)可分为以下两种: 1) 本地临时存储过程 不论哪一个数据库是当前数据库,如果在创建存储过程时,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程(例如,CREATE PROCEDURE # book_proc)。 2) 全局临时存储过程 不论哪一个数据库是当前数据库,只要所创建的存储过程名称是以两个井字号(# #)开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程(例如,CREATE PROCEDURE # # book_proc)。,存储过程的类型,第8章 存储过程与触发器,存储过程的优点 存储过程与视图的比较 (1) 可以在单个存储过程中执行一系列Transact-SQL语句,而在视图中只能是SELECT语句。 (2) 视图不能接受参数,只能返回结果集;而存储过程可以接受参数,包括输入、输出参数,并能返回单个或多个结果集以及返回值,这样可大大地提高应用的灵活性。,第8章 存储过程与触发器,创建存储过程 CREATE PROCEDURE procedure_name WITH ENCRYPTION WITH RECOMPILE AS Sql_statement 【例8.1】 使用Transact-SQL语句在book数据库中创建一个名为p_book1的存储过程。该存储过程返回book1表中所有出版社为“中国长安”的记录。 在SQL Server Management Studio查询窗口中运行如下命令: USE book GO CREATE PROCEDURE p_book1 AS SELECT * FROM BOOK1 WHERE 出版社=中国长安,创建和执行存储过程,第8章 存储过程与触发器,在存储过程创建成功后,用户可以执行存储过程来检查存储过程的返回结果。 执行存储过程的基本语法如下: EXEC procedure_name 【例8.2】 使用Transact-SQL语句执行【例8.1】中创建的存储过程。 在SQL Server Management Studio查询窗口中运行如下命令: USE book GO EXEC p_book1,执行存储过程,第8章 存储过程与触发器,1带输入参数的存储过程 为了定义接受输入参数的存储过程,需要在CREATE PROCEDURE语句中声明一个或多个变量作为参数。 其语法格式如下: CREATE PROCEDURE procedure_name parameter_name datatype=default with encryption with recompile AS Sql_statement 【例8.4】 使用Transact-SQL语句在book数据库中创建一个名为p_book1P的存储过程。该存储过程能根据给定的出版社返回该出版社代码对应的book1表中的记录。 【事例分析】在【例8.1】中AS后的语句SELECT* FROM book1 WHERE 出版社=中国长安,将出版社“中国长安”用变量代替为:SELECT* FROM book1 WHERE 出版社=出版社,其中变量名“出版社”取代了值“中国长安”。 在SQL Server Management Studio查询窗口中运行如下命令: CREATE PROCEDURE p_book1p 出版社 varchar(20) AS SELECT * FROM book1 WHERE 出版社=出版社,带参数的存储过程,第8章 存储过程与触发器,1) 使用参数名传递参数值 在执行存储过程的语句中,通过语句parameter_name=value 给出参数的传递值。当存储过程含有多个输入参数时,参数值可以任意顺序设定,对于允许空值和具有默认值的输入参数可以不给出参数的传递值。 其语法格式如下: EXEC procedure_name parameter_name=value ,n 【例8.5】 用参数名传递参数值的方法执行存储过程p_book1p,分别查询出版社为“中国长安”和“安徽人民”书的记录。 在SQL Server Management Studio查询窗口中运行如下命令: EXEC p_book1p 出版社=中国长安 GO EXEC p_book1p 出版社=安徽人民 GO,执行含有输入参数的存储过程,第8章 存储过程与触发器,2) 按位置传递参数值 其语法格式如下: EXEC procedure_name value1,value2,. 【例8.6】 用按位置传递参数值的方法执行存储过程 p_book1p,分别查找出版社为“中国人口”和“内蒙人民”书的记录。 在SQL Server Management Studio查询窗口中运行如下命令: EXEC p_book1p 内蒙人民 GO EXEC p_book1p 中国人口 GO,执行含有输入参数的存储过程,第8章 存储过程与触发器,如果需要从存储过程中返回一个或多个值,可以通过在创建存储过程的语句中定义输出参数来实现,为了使用输出参数,需要在CREATE PROCEDURE语句中指定OUTPUT关键字。 输出参数语法如下: parameter_name datatype=default OUTPUT 【例8.7】 创建存储过程p_book1Num,要求能根据用户给定的出版社,统计该出版社的出书数量,并将数量以输出变量的形式返回给用户。 在SQL Server Management Studio查询窗口中运行如下命令: CREATE PROCEDURE p_book1Num 出版社 VARCHAR(20), book1Num smallint output AS SET book1Num= ( SELECT COUNT(*) FROM book1 WHERE 出版社=出版社 ) PRINT book1Nu,执行含有输入参数的存储过程,第8章 存储过程与触发器,通过视图更新数据,【例8.8】 执行存储过程p_book1Num。 由于在存储过程p_book1Num中使用了参数出版社和book1Num,所以,在测试时需要先定义相应的变量,对于输入参数出版社需要赋值,而输出参数book1Num无需赋值,它是从存储过程中获得返回值供用户进一步使用的。 在SQL Server Management Studio查询窗口中运行如下命令: DECLARE 出版社VARCHAR(20),book1Num SMALLINT SET 出版社=中国长安 EXEC p_book1Num 出版社,book1Num,第8章 存储过程与触发器,存储过程的修改 修改存储过程是由ALTER语句来完成的,其语法如下: ALTER PROCEDURE procedure_name WITH ENCRYPTION WITH RECOMPILE AS Sql_statement 【例8.9】 使用Transact-SQL语句修改存储过程p_book1p,根据用户提供的出版社名称进行模糊查询,并要求加密。 在SQL Server Management Studio查询窗口中运行如下命令: ALTER PROCEDURE p_book1p 出版社VARCHAR(20) WITH encryption AS SELECT 出版社,ISBN号,定价,作者姓名 FROM book1,teacher WHERE book1.编号=teacher.编号and 出版社LIKE %出版社%,修改、删除、重命名存储过程,第8章 存储过程与触发器,存储过程的删除 存储过程的删除是通过DROP语句来实现的。 【例8.10】 使用Transact-SQL语句来删除存储过程p_book1。 在SQL Server Management Studio查询窗口中运行如下命令: USE book GO DROP procedure p_book1,修改、删除、重命名存储过程,第8章 存储过程与触发器,SQL Server 2005为用户提供了3种重新编译的方法: 1在创建存储过程时使用WITH RECOMPILE 子句 WITH RECOMPILE 子句可以指示SQL Server 2005不将该存储过程的查询计划保存在缓存中,而是在每次运行时重新编译和优化,并创建新的查询计划。 【例8.13】 使用WITH RECOMPILE 子句创建【例8.4】中的存储过程,使其在每次运行时重新编译和优化。 在SQL Server Management Studio查询窗口中运行如下命令: USE book GO CREATE PROCEDURE p_book1p 出版社 VARCHAR(20) WITH RECOMPILE AS SELECT * FROM book1 WHERE 出版社=出版社,存储过程的重编译处理,第8章 存储过程与触发器,2在执行存储过程时设定重新编译选项 通过在执行存储过程时设定重新编译,可以让SQL Server 2005在执行存储过程时重新编译该存储过程,在这一次执行后,新的查询计划又被保存在缓存中。 其语法格式如下: EXECUTE procedure_name WITH RECOMPILE 【例8.14】 以重新编译的方式执行存储过程p_book1p。 在SQL Server Management Studio查询窗口中运行如下命令: USE book GO EXECUTE p_book1p 中国长安WITH RECOMPILE 此方法一般在存储过程创建后,数据发生了显著变化时使用,存储过程的重编译处理,第8章 存储过程与触发器,3通过系统存储过程设定重新编译选项 其语法如下: EXEC sp_recompile OBJECT 其中,OBJECT:当前数据库中的存储过程、表或视图的名称。 【例8.15】 执行下面的语句将导致book1表的触发器和存储过程在下次运行时将被重新编译。 在SQL Server Management Studio查询窗口中运行如下命令: EXEC sp_recompile book,存储过程的重编译处理,第8章 存储过程与触发器,触发器的基本概述 触发器也是一种存储过程,它是一种在基本表被修改时自动执行的内嵌过程,主要通过事件进行触发而被执行 存储过程可以通过存储过程名字而被直接调用 触发器的主要作用是其能实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,触发器的创建和管理,第8章 存储过程与触发器,触发器的创建 基本语法如下: CREATE TRIGGER trigge_name ONtable |view FOR |AFTER |INSTEAD OF INSERT,UPDATE,DELETE WITH ENCRYPTION AS IF UPDATE(cotumn_name) and |or UPDATE(column_name) sql_statesments,触发器的创建和管理,第8章 存储过程与触发器,1) INSERT触发器 【例8.16】 在book数据库的book1表上创建一个book1_triggerl触发器,当执行INSERT操作时,该触发器被触发(即向所定义触发器的表中插入数据时触发器被触发)。 在SQL Server Management Studio查询窗口中运行如下命令: USE book GO CREATE TRIGGER book1_trigger1 ON book1 FOR INSERT AS PRINT 数据插入成功 GO 当用户向book1表中插入数据时将触发触发器,而且数据被插入表中,如向表中加入如下记录内容: INSERT INTO book1 VALUES(YBZT2411,7500433921,SQL2005,25.00,中山大学,2007 ),触发器的创建和管理,第8章 存储过程与触发器,2) UPDATE触发器 在带有UPDATE触发器的表上执行UPDATE语句时,将触发UPDATE触发器。使用UPDATE触发器时,用户可以通过定义IF UPDATE(column name)语句来实现。 【例8.18】 在book数据库的book1表上建立一个名为book1_trigger3的触发器,该触发器将被UPDATE操作激活,该触发器将不允许用户修改表的“定价”列(本例将不使用INSTEAD OF,而是通过ROLLBACK TRANSACTION子句恢复原来数据的方法,来实现字段不被修改)。 建好触发器后试着执行UPDATE操作: 运行结果显示:“Unauthorized!”说明操作无法进行,触发器起到保护作用。 在SQL Server Management Studio查询窗口中运行如下命令: USE book GO CREATE TRIGGER book1_trigger3 ON book1 FOR UPDATE AS IF UPDATE(定价) BEGIN ROLLBACK TRANSACTION END,触发器的创建和管理,第8章 存储过程与触发器,在触发器建立后,在SQL Server Management Studio查询窗口中运行如下命令: USE book GO UPDATE book1 SET 定价=5000 WHERE 编号=YBZT2411 但是UPDATE操作可以对没有建立保护性触发的其他列进行更新,而不会激发触发器。 例如,在SQL Server Management Studio查询窗口中运行如下命令: USE book GO UPDATE book1 SET 出版社=华师大 WHERE 编号=YBZT2411 在SQL Server Management Studio查询窗口中运行如下命令: USE book SELECT * FROM book1 WHERE 编号=YBZT2411,触发器的创建和管理,第8章 存储过程与触发器,3) DELETE触发器 【例8.19】 在book数据库的book1表上建立一个名为book1_trigger4的DELETE触发器,该触发器将对book1表中删除记录的操作给出提示信息,并取消当前的删除操作。 在SQL Server Management Studio查询窗口中运行如下命令: USE book GO CREATE TRIGGER book1_trigger4 ON book1 FOR DELETE AS BEGIN RAISERROR(Unauthorized!,10,1) ROLLBACK TRANSACTION END 建好触发器后,在SQL Server Management Studio查询窗口中运行如下命令: DELETE FROM book1 WHERE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中考专练:书面表达-(含答案)
- 农业大数据时代2025年农产品无损检测技术与物联网的融合报告
- 两江投资面试题库及答案
- 理财会计面试题及答案
- 兰州护士面试题目及答案
- 农业产业强镇建设资金申请项目产业链优化与整合报告
- 库房会计面试题目及答案
- 康宁会计面试题目及答案
- 电子合同签署流程
- 美术馆展览策划活动规划策略总结计划制定
- 2025至2030有机聚合物钽电容器行业发展趋势分析与未来投资战略咨询研究报告
- 2025年教师节感恩教师主题班会课件
- 建筑培训教学课件
- 2025沈阳各区县(市)工会公开招聘工会社会工作者数量考试参考试题及答案解析
- 2025年中国DDX58抗体行业市场全景分析及前景机遇研判报告
- 学习乐理音程课件
- (2025秋新版)苏教版小学数学二年级上册全册教案
- 《燃煤火力发电企业设备检修导则》
- 食品试验设计与统计分析
- 公安民警心理压力应对Baidu课件
- 会议电视系统工程设计规范附条文说明
评论
0/150
提交评论