版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据库技术与应用数据库技术与应用教材编写组第六章存储过程与触发器存储过程的基本概念存储过程的特点与作用触发器的基本概念触发器的特点与作用存储过程创建、执行以及参数应用的方法触发器的创建及使用方法存储过程的参数应用方法2问题提出为什么需要存储过程?存储过程是什么?为什么要触发器?触发器是什么?3?6.1存储过程概述存储过程的特点和类型存储过程的创建和执行存储过程参数和执行状态存储过程的查看和修改存储过程的删除46.1.1存储过程的特点和类型存储过程是存储在服务器上的Transact-SQL语句的命名集合。是封装重复任务的方法存储过程的特点封装复杂操作加快系统运行速度实现代码重用增强安全性减少网络流量调用方便5查询通知的工作流数据库监视6.1.1存储过程的特点和类型存储过程的类型SQLServer2008中常用的存储过程类型有3种:系统存储过程(sp_):由数据库系统自身创建,存储在master数据库中,以“sp_”前缀标识用户定义存储过程(本地存储过程):
在单独的用户数据库内由用户创建。临时存储过程:可以是局部的,名称以“#”开头;也可以是全局的,名称以“##”开头。扩展存储过程(xp_):以动态链接库(DLL)的形式实现。以“xp_”为前缀,只能添加到master数据库中,在SQLServer环境外执行。66.1.2存储过程的创建和执行创建存储过程实际是对存储过程进行定义的过程,主要包含:存储过程名称及其参数的说明和存储过程的主体(包含执行过程操作的T-SQL语句)两部分。可以使用3种方法创建存储过程:
使用图形工具使用向导使用Transact-SQL语言中的CREATEPROCEDURE语句76.1.2存储过程的创建和执行使用图形工具创建存储过程86.1.2存储过程的创建和执行使用CREATEPROCEDURE语句创建存储过程
语法格式如下:
CREATEPROC[EDURE][schema_name.]procedure_name[;number] [{@parameter[schema_name.]data_type} [VARYINGdefault][OUTPUT]] [WITH{RECOMPILE|ENCRYPTION |RECOMPILE,ENCRYPTION}] [FORREPLICATION] AS
sql_statement[...n]9注意事项:只能在本地数据库中创建存储过程;可以引用在同一存储过程中创建的对象,只要引用时已经创建了该对象即可可以在存储过程内引用临时表,如果在存储过程内创建本地临时表,则临时表仅为该存储过程而存在;退出该存储过程后,临时表将消失根据可用内存的不同,存储过程最大可达128MB
注意:schema_name表示架构名,如dbo.student,其中dbo是一个架构名,表示系统管理员。ENCRYPTION表示加密;REPLICATION表示复制6.1.2存储过程的创建和执行【例6.1】在Student数据库中创建一个名为p_Stu的存储过程,它将从表中返回所有学生的姓名、性别、班级、电话
存储过程只能建立在当前数据库上,故需先用USE语句来指定数据库USEStudentGo存储过程的内容如下:
CREATEPROCEDUREp_StuAS
SELECTSt_ID,St_Sex,Cl_Name,TelephoneFROMSt_Info
以存储过程是从单个表中提取数据,最终返回了学生的简明信息。106.1.2存储过程的创建和执行【例6.2】创建一个带SELECT查询语句的名为“Average_Score”的存储过程。从学生表、课程表、选课表返回每位修课学生的课程平均分。
分析:
学生表与选课表通过“St_ID”关联,
课程表与选课表通过“C_No”关联,
要查到每个学生的修课平均分,需要通过聚集函数AVG计算,因为引用了聚集函数,SELECT查询中必须使用GROUPBY分组。
11CREATEPROCAverage_Score
ASSELECT
St_Name,AVG(Score)ASAvgScoreFROMSt_Info,S_C_Info,C_InfoWHERESt_Info.St_ID=S_C_Info.St_ID
ANDS_C_Info.C_No=C_Info.C_NoGROUPBY
St_Name
6.1.2存储过程的创建和执行使用EXECUTE(或EXEC)命令执行存储过程
语法格式如下:
[[EXEC[UTE]]{[@return_status=]procedure_name[;number]
|@procedure_name_var} [[@parameter=]{value|@variable
[OUTPUT]|[DEFAULT]][,...n] [WITHRECOMPILE]
注意事项:执行存储过程必须具有执行该过程的权限许可
如果存储过程是批处理中的第一条语句,EXECUTE命令可以省略存储过程的最大大小为128MB12WITHRECOMPILE表示过程在运行时重新编译6.1.2存储过程的执行例6.3执行例【例6.2】所创建的存储过程Average_Score。新建查询,在“查询设计器”中输入并运行以下语句:USEStudentGOEXECAverage_Score输出结果如右图所示。136.1.2存储过程的执行使用对象资源管理器中执行存储过程,操作方法如下:
146.1.3存储过程参数和执行状态存储过程参数类型有:“输入”和“输出”参数(1)输入参数
定义存储过程时,可指定输入参数,以@作为参数名称的前置字符,声明若干个参数变量及其数据类型,一个存储过程最多指定1024个参数。(2)输出参数如果要在存储过程中传回值给调用者,可在参数名称后使用OUTPUT关键词。同时,为了使用输出参数,必须在创建和执行存储过程时都使用OUTPUT关键词。156.1.3存储过程参数和执行状态【例6.4】创建一个带两个参数的存储过程,从St_Info、C_Info、S_C_Info表的相关联接中返回输入参数的学生姓名和课程类别、该学生选课的课程名称和成绩。
CREATEPROCEDUREScoreInfo@stnamevarchar(20),@ctypechar(4)AS
SELECTSt_Name,C_Type,C_Name,Score FROMSt_Infoa,S_C_Infob,C_Infoc WHEREa.St_ID=b.St_IDANDb.C_No=c.C_NoAND
St_Name=@stnameANDC_Type=@ctype在“新建查询”窗格中输入并运行如下命令:
EXECScoreInfo
'吴中华','必修'输出结果:166.1.3存储过程参数和执行状态两种传递参数的方式:位置标识和名字标识。位置标识传递参数只按顺序提供值参数值必须以参数的定义顺序列出可以忽略有默认值的参数,但不能中断次序例:EXECScoreInfo'吴中华','必修'
名字标识传递值在调用语句中以“@参数名=值”的格式指定参数当通过参数名传递值时,可以以任何顺序指定参数值,并且可省略允许空值或具有默认值的参数若在“新建查询”窗格中输入并运行如下命令:
EXECScoreInfo
@ctype='必修',@stname='吴中华'EXECScoreInfo
@ctype='必修',@stname='杨平娟'176.1.3存储过程参数和执行状态-举例【例6.5】创建带一个输入参数和一个输出参数的存储过程,通过输入参数在St_Info表中查询指定学号的学生,以输出参数的形式返回学生所在的班级名称(Cl_Name字段)。
创建此存储过程的语句如下:
CREATEPROCStClass
@stidchar(10),@class_namechar(20)
OUTPUTAS SELECT@class_name
=cl_name
FROMSt_Info
WHERESt_Info.St_ID=@stid
执行该存储过程的语句如下:
DECLARE
@get_clname
char(20)EXECStClass'0603060109',@get_clnameOUTPUTSELECT@get_clname注意:变量被声明,其值会先被设为NULL。186.1.3存储过程参数和执行状态-举例使用“执行过程”对话框操作196.1.3存储过程参数和执行状态返回存储过程状态为了增强存储过程的效率,应使用错误信息向用户传达事务状态(成功或失败)。RETURN语句从查询或存储过程无条件返回,同时可以返回一个整数状态值(返回码)返回码为0表示执行成功,返回-1~-99之间的整数,表示执行失败。206.1.3存储过程参数和执行状态【例6.6】修改【例6.5】示例中的存储过程,分3种情况返回不同的执行状态:如果输入空的学号参数值,则返回执行状态“-1”;如果在St_Info表中不存在指定学号的学生,则返回执行状态“-2”;除前两种情况之外(即找到了指定学号的学生),则返回执行状态“0”表示执行正常。修改此存储过程的语句如下:
CREATEPROCEDUREStClass_new
@stid
char(10)=NULL,@class_name
char(20)OUTPUTASIF@stidISNULL
RETURN-1--IF或ELSE条件只能影响一个SQL语句(p39)SELECT@class_name=cl_name
FROMSt_Info WHERESt_Info.St_ID=@stidIF@class_nameISNULL
RETURN-2RETURN0216.1.3存储过程参数和执行状态正确接收返回的状态的存储过程执行语句形式:
EXEC@status_var=过程名称调用带输出参数的存储过程,根据返回码进行输出【例6.6】的执行过程:
DECLARE@status_return
intDECLARE@get_clnamechar(20)EXEC@status_return=StClass_new
'0603170109'
,@get_clname
OUTPUT
IF@status_return=-1 PRINT'没有输入学号'ELSE
IF@status_return=-2 PRINT'找不到这个学号的学生' ELSE PRINT@get_clname
226.1.4存储过程的查看和修改使用对象资源管理器查看或修改存储过程236.1.4存储过程的查看和修改使用系统存储过程查看存储过程24系统存储过程作
用使用语法sp_helptext查看存储过程的文本信息sp_helptext[@objname=]存储过程名sp_depends查看存储过程的相关性sp_depends[@objname=]存储过程名sp_help查看存储过程的一般信息sp_help[@objname=]存储过程名6.1.4存储过程的查看和修改使用ALTERPROCEDURE语句修改存储过程语法格式:ALTERPROC[EDURE][schema_name.]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[,...n]参数和保留字的含义说明与CREATEPROCEDURE语句一致。256.1.4存储过程的查看和修改重命名存储过程可使用系统存储过程sp_rename,语法格式:
sp_rename'storedprocedureobject_name', 'storedprocedurenew_name'【例6.8】将【例6.1】创建的存储过程p_Stu更名为Student_proc。完成操作的语句:
sp_rename'p_Stu','Student_proc'注意:通过对象资源管理器也可以修改存储过程的名称26存储过程老名称存储过程新名称6.1.5存储过程的删除删除存储过程使用DROPPROCEDURE语句从当前数据库中移除用户定义存储过程语法格式:DROPPROC[EDURE]{procedure_name}[,...n]删除存储过程的注意事项在删除存储过程之前,执行系统存储过程sp_depends检查是否有对象依赖此存储过程。276.1.5存储过程的删除【例6.10】删除例6.2所创建的存储过程Average_Score。完成操作的语句:USEstudent_dbGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname='Average_Score')DROPPROCEDUREAverage_Scoreelseprint'Average_Score存储过程不存在'注意:不论是重命名存储过程名称还是删除了存储过程,都会影响到引用该存储过程的其他数据库对象。28在系统视图下可以找到系统对象表sysobjects
归属于sys架构,它保存当前数据库的对象,如约束、默认值、日志、规则、存储过程等6.2触发器概述触发器的特点和类型触发器的创建触发器的查看和修改触发器的删除296.2.1触发器的特点和类型触发器(trigger)是SQLServer数据库中一种特殊类型的存储过程,不能由用户直接调用,而且可以包含复杂的T-SQL语句。它是一个在修改指定表中的数据时执行的存储过程。用户可以用它来强制实施复杂的业务规则,以此确保数据的完整性。306.2.1触发器的特点和类型触发器的特点触发器与表紧密相连,可以看作表定义的一部分。触发器是基于一个表创建的,但是可以针对多个表进行操作,实现数据库中相关表的级联更改。触发器不能通过名称被直接调用,更不允许带参数,而是当用户对表中的数据进行修改这样的事件发生时,自动执行的行为。触发器可以用于SQLServer约束、默认值和规则的完整性检查,实施更为复杂的数据完整性约束。触发器可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中可以存在多个同类触发器(INSERT、UPDATE或DELETE),对于同一个修改语句可以有多个不同的对策用以响应。316.2.1触发器的特点和类型触发器的类型按触发事件不同分为2类(1)DDL(数据定义语言)触发器 是指当服务器或数据库中发生DDL事件时将启用。DDL事件即指在表或索引中的create、alter、drop语句。(2)DML(数据操纵语言)触发器 是指触发器在数据库中发生DML事件时将启用。DML事件即指在表或视图中修改数据的insert、update、delete语句。因此DML触发器也可分为3种类型:INSERT触发器、UPDATE触发器、DELETE触发器。326.2.1触发器的特点和类型触发器的类型按触发器被激活的时机可以分为以下两种类型:(1)AFTER触发器(后触发器) 是在触发动作之后再触动,可视为控制触发器激活时间的机制。在引起触发器执行的更新语句成功完成之后执行。如果更新语句因错误(如违反约束或语法错误)而失败,触发器将不会执行。
此类触发器只能定义在表上,不能创建在视图上。可以为每个触发操作(如INSERT、UPDATE或DELETE)创建多个AFTER触发器。(2)INSTEADOF触发器(替代触发器) 将在数据变动以前被触发,该类触发器代替触发操作被执行。
该类触发器既可在表上定义,也可在视图上定义。对于每个触发操作(INSERT、UPDATE和DELETE)只能定义1个INSTEADOF触发器336.2.2触发器的创建与触发器相关的虚拟表在触发器执行的时候,系统产生两个临时表:inserted表和deleted表。(1)inserted表存储着被INSERT和UPDATE语句影响的新的数据记录。当用户执行INSERT和UPDATE语句时,新数据记录的备份被复制到inserted临时表中。(2)deleted表存储着被DELETE和UPDATE语句影响的旧数据记录。在执行DELETE和UPDATE语句过程中,指定的旧数据记录被用户从基本表中删除,然后转移到delete表中。346.2.2触发器的创建创建触发器主要有T-SQL语句和对象资源管理器等方式。1.使用CREATETRIGGER语句创建触发器
语法格式:
CREATETRIGGER[schema_name.]trigger_nameON{table_name|view_name}[WITHENCRYPTION]{FOR|AFTER|INSTEADOF}{[DELETE][,][INSERT][,][UPDATE]}ASsql_statement[,...n]例:
CREATETRIGGETtrig_stu ONStudent AFTERINSERT,DELETE,UPDATEAS
SELECT*FROMstudent35创建触发器必须指定的选项:名称;在其上定义触发器的表;触发器将何时激发;激活触发器的数据修改语句;执行触发操作的编程语句;对CREATETRIGGER语句的文本加密。
6.2.2触发器的创建创建触发器注意事项:(1)CREATETRIGGER语句必须是批处理中的第一条语句。(2)只能在当前数据库中创建触发器,一个触发器只能对应一个表。(3)表的所有者具有创建触发器的默认权限,不能将该权限转给其他用户。(4)不能在视图、临时表、系统表上创建触发器,但是触发器可以引用视图、临时表,但是不能引用系统表。(5)尽管TRUNCATETABLE语句类似于没有WHERE子句的DELETE语句,但由于该语句不被记入日志,所以它不会引发DELETE触发器。366.2.2触发器的创建【例6.11】创建DelCourse触发器的语句如下:CREATETRIGGERDelCourseONC_InfoFORDELETEASDELETES_C_InfoWHEREC_NoIN(SELECTC_NoFROMdeleted)在“新建查询”窗格中输入以下语句并执行:DELETEFROMC_InfoWHEREC_No='29000011'
注意:该语句从C_Info表中删除课程编号为“29000011”的数据行,触发DelCourse触发器,产生信息:376.2.2触发器的创建2.使用图形界面方式创建触发器在表St_Info上创建触发器,操作步骤:38在学生表St_Info中的INSERT操作上创建了一个名称为“st_Insert”的触发器。当在该表上执行任何有效的插入操作(不论是否实际插入了记录)时,都会激活该触发器,将变量@str的值设为“TRIGGERISWORKING”。PRINT命令的作用是向客户端返回用户定义的消息。6.2.3触发器的查看和修改1.使用对象资源管理器查看触发器信息396.2.3触发器的查看和修改2.使用系统存储过程查看触发器信息在SQLServer中,根据不同需要,可以使用sp_helptext、sp_depends、sp_help等系统存储过程来查看触发器的不同信息。例:406.2.3触发器的查看和修改专门查看触发器属性信息的系统存储过程:sp_helptrigger,语法格式:sp_helptrigger[@tabname=]'table' [,[@tr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年绍兴市越城区法检系统书记员招聘笔试参考题库及答案详解
- 2026年阜新市清河门区法检系统书记员招聘笔试参考试题及答案详解
- 四川能投发展股份有限公司所属公司2026年员工公开招聘考试备考题库及答案详解
- 2026上海崇明区区管企业统一招聘调剂14人考试备考题库及答案详解
- 2025年广东省江门市法检系统书记员招聘考试试题及答案详解
- 通信线路优化建设方案
- 2025年鄂尔多斯市东胜区法检系统书记员招聘笔试试题及答案详解
- 2026年西安海臣财务咨询有限公司招聘笔试备考试题及答案详解
- 2026年榆林市榆阳区法检系统书记员招聘笔试参考试题及答案详解
- 2025年大庆市萨尔图区法检系统书记员招聘笔试试题及答案详解
- 乡镇综合行政执法培训
- DB35T 1036-2023 10kV及以下电力用户业扩工程技术规范
- 北京市初级注册安全工程师真题
- DL∕T 1315-2013 电力工程接地装置用放热焊剂技术条件
- 符合TSG07-2019规范电梯安装含修理质量手册+程序文件+部分维保方案及自检记录表样2021版
- 化学品作业场所安全警示标志双氧水
- 22G101三维立体彩色图集
- 子宫MRI诊断课件-
- 临床医学概要
- 药剂学试题及答案
- 联合国国际货物销售合同公约课件
评论
0/150
提交评论