已阅读5页,还剩82页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
存储过程和触发器,计算机科学与工程学院2012年9月,存储过程的概述,存储过程:几种存储在sqlserver中的sql语句和流程控制语句的预编译集合,用以实现某种任务。使用存储过程的好处:(1)减少客户端代码的重复。只需要创建一次存储过程并将其存储在数据库中,以后即可在客户端程序中多次调用该存储过程。(2)允许更快的执行。如果某操作需要大量的Sql代码或重复执行,使用存储过程将比在酷暑段执行那个SQ代码的执行速度要快。存储过程在服务器段经过预编译,生成查询计划,可以直接执行,二在哭护短每次运行SQL语句时,都要从客户端重复发送,在SQLSERVER执行这些语句时,都要对其进行那个编译和优化。(3)减少网络流量。如:一个需要百行SQL代码的操作由一条执行过程代码的单独语句就可以实现,而不需要在网络中发送百行代码。,存储过程的概述,使用存储过程的好处:(3)简化数据库管理。如,要修改某种查询,如果查询重复放在客户机上,则要在所有客户机上修改查询,而使用存储过程可以集中修改;(4)可作为安全机制的使用。直接发送sql语句可能会泄露密码等,而采用存储过程只需传递必要的参数即可。,存储过程的分类,系统存储过程:存储在master数据库中,用于执行sqlserver的某些管理功能、显示数据库和用户的信息。系统存储过程以sp_开头,可以在任何数据库中执行。用户存储过程:用户自己创建并存储在用户数据库中的存储过程。临时存储过程分为两种:(1)本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;(2)全局临时存储过程,以两个井字号(#)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。,存储过程的分类,远程存储过程:在SQLServer2005中,远程存储过程(RemoteStoredProcedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。扩展存储过程:扩展存储过程(ExtendedStoredProcedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。,存储过程的创建,1创建存储过程的格式CREATEPROCEDURE存储过程名参数名数据类型=defaultOUTPUT,nWithrecompile|encryption|recompile,encryptionASSQL语句存储过程名:必须符合标识符命名规则;编号:可选整数,用于对同名的存储过程分组,以便用一条dropprocedure语句将同组的存储过程一起删除;参数:过程中的参数,在创建过程的语句中可以声明一个或多个参数。用户必须在执行存储过程时提供每个所声明参数的值。参数名称前必须使用符号,每个过程的参数仅用于该过程本身。在其他过程中可以使用相同的参数名称。参数只能用于代替常量,而不能代替表名、列名或其他数据库对象的名称,存储过程的创建,1创建存储过程的格式(续)数据类型:参数的数据类型,所有数据类型都可以作为存储过程的参数。但是cursor数据类型只能用于output参数。如果指定的数据类型为cursor,也必须同时指定varying和output关键字。Varying:指定作为输出参数支持的结果集,仅适用于游标参数。默认值:参数的默认值,如果定义了默认值,可以不必指定参数的值即可执行存储过程。默认值通常为null或常量。Output:表明该参数是返回参数,使用该参数可以将信息返回给调用过程,text,ntext和image参数可用于output参数。Recompile:表明不保存该存储过程的执行计划,该存储过程将在运行时重新编译。Encryption:指定sqlserver对syscomments表中包含本createprocedure语句文本的条目进行加密。AS:用于指定该存储过程要执行的操作。Sql语句:存储过程中要包含的sql语句。,存储过程的创建,例:创建一个存储过程,可以将所有学生的入学成绩增加10%createprocedureasc_gradeasupdatescsetgrade=grade+grade*0.1例:如果存在同名的存储过程则删除之后再建立ifexists(selectnamefromsysobjectswherename=asc_gradeandtype=P)dropprocedureasc_gradecreateprocedureasc_gradeasupdatescsetgrade=grade+10,存储过程的创建,例:创建一个存储过程stu_degree,用于检索所有学生的成绩记录,并编写sql语句执行该存储过程和查看输出的结果(1)先判断是否存在同名存储过程,若存在则删除Ifexists(selectnamefromsysobjectswherename=stu_degreeandtype=P)dropprocedurestudegree(2)创建存储过程createprocedurestu_degreeasselectstudent.sno,student.sname,SC.cnofromstudent,SWherestudent.sno=SC.snoOrderbystudent.sno,存储过程的创建,例:创建一个存储过程stu_grade,该存储过程返回“平均成绩大于90”的学生信息。(1)判断是否存在同名存储过程ifexists(selectnamefromsysobjectswherename=stu_gradeandtype=P)dropprocedurestu_grade(2)创建存储过程createprocstu_gradeasselectstudent.sno,sname,sex,class,deptfromstudent,(selectavg(grade)avg_grade,sc.snofromsc,studentwherestudent.sno=sc.snogroupbysc.snohavingavg(grade)=90)sc1wherestudent.sno=sc1.sno,存储过程的创建,带参数的存储过程:存储过程的参数分为输入参数和输出参数两种,输入参数用于向存储过程提供数据,而输出参数则能将存储过程中的数据返回到调用程序。在定义过程时,指定参数的格式如下:参数名数据类型=默认值output,后面使用output则表示是输出参数带参数的存储过程:例:创建一个存储过程add_proc,用于计算两个参数之和并将其输出。(1)创建存储过程Createprocedureadd_procnum1int=0,num2int=0Asdeclarenum3intsetnum3=num1+num2Printnum3说明:该存储过程中定义了两个参数num1和num2,都是输入参数,类型为Int,默认值为0。,存储过程的创建,带参数的存储过程:例:创建一个存储过程add_proc,用于计算两个参数之和并将其输出。(2)执行存储过程(不带参数)execadd_proc(3)执行存储过程(带参数)execadd_proc15,25例:创建一个存储过程add_proc1,用于计算两个参数之和,用输出参数返回结果。Createprocedureadd_procnum1int=0,num2int=0,num3intoutputAssetnum3=num1+num2Printnumg3执行:declaresumintexecadd_proc2,3,sum执行存储过程add_proc的输出参数值保存到sum变量中,存储过程的创建,例:编写一存储过程,实现查询顾客某一日期后所订购的货物及其总量(northwind数据库)创建存储过程:createtablecustomer(customeridchar(10),addresschar(20)insertintocustomervalues(warth,曲靖师范学院)createtableorders(orderidint,customeridchar(10),orderdatedatetime)insertintoordersvalues(110,warth,1995-1-10)createtableorderdetails(productidint,orderidint,quantityint)insertintoorderdetailsvalues(11,110,560)dropprocedurecustomer_quantitycreateprocedurecustomer_quantitycustomeridchar(10),orderdatedatetimeasselectproductid,sum(quantity)totalfromorderdetails,orderswhereorderdate0print该商品已经存在else-不存在insertintogoodsvalues(goodsname,goodsid,status,storage),存储过程的创建,Createtableproducts(productidchar(10),productnamechar(10),quantityint)createprocedureproduct_aproduct_idchar(10)asif(selectquantityfromproductswhereproductid=product_id)10and(selectquantityfromproductswhereproductid=product_id)15beginprint库存量充裕return(3)end,例:创建一个商品库存量并返回执行状态码和库存信息的存储过程product_a,它接受商品编号为输入参数,然后判断该商品的库存量,如果数量大于15,则输出“商品库存量充裕”并返回3,如果数量在515之间,则输出“商品库存量良好,供应正常“并返回2,如果数量小于5,则输出”商品库存量不足“。执行存储过程:declaresum_productchar(10)execsum_product=product_aa110print返回值为:+str(sum_product),存储过程的创建,createprocedureproduct_aproduct_idchar(10),returnmessagechar(20)outputasif(selectquantityfromproductswhereproductid=product_id)10and(selectquantityfromproductswhereproductid=product_id)15beginprint库存量充裕setreturnmessage=3printreturnmessageend,例:创建一个商品库存量并返回执行状态码和库存信息的存储过程product_a,它接受商品编号为输入参数,然后判断该商品的库存量,如果数量大于15,则输出“商品库存量充裕”并返回3,如果数量在515之间,则输出“商品库存量良好,供应正常“并返回2,如果数量小于5,则输出”商品库存量不足“。执行存储过程:declaremessagechar(10)execproduct_aa110,message,存储过程的创建,createprocedureproduct_aproduct_idchar(10)asdeclarequantityintselectquantity=quantityfromproductswhereproductid=product_idifquantity10andquantity15beginprint库存量充裕return(3)end,例:创建一个商品库存量并返回执行状态码和库存信息的存储过程product_a,它接受商品编号为输入参数,然后判断该商品的库存量,如果数量大于15,则输出“商品库存量充裕”并返回3,如果数量在515之间,则输出“商品库存量良好,供应正常“并返回2,如果数量小于5,则输出”商品库存量不足“。(对前一个存储过程的改进)执行:declareresultintexecresult=product_aa110printresult,存储过程的创建),createtablestudent(snochar(10),classidchar(10),sdeptidint,c_gradeint,sdeptnamechar(10)insertintostudentvalues(2009142101,A,1,700,计算机)insertintostudentvalues(2009142102,A,1,600,计算机)createtablesdept(sdeptidint,sdeptnamechar(10)insertintosdeptvalues(1,计算机),存储过程的创建,例:创建存储过程avgscore,用于根据给定的院系和班级名称计算平均成绩,并使用输出参数返回结果。createprocedureavgscore4orgvarchar(100),-接受系名classvarchar(50),-接受班级classscorefloatoutput-接受平均成绩asdeclareorgidintsetorgid=0selectorgid=sdeptidfromsdeptwheresdeptname=orgiforgid=0beginsetscore=0print指定的院系记录不存在endelsebeginselectscore=avg(c_grade)fromstudentwheresdeptid=orgidandclassid=classgroupbyclassidend,例:创建存储过程avgscore,用于根据给定的院系和班级名称计算平均成绩,并使用输出参数返回结果。createprocedureavg_classclassidchar(10),sdeptidintasifexists(selectclassid,sdeptidfromstudentwhereclassid=classidandsdeptid=sdeptid)selectavg(c_grade)fromstudentwhereclassid=classidandsdeptid=sdeptidelseprint不存在这样的班级或院系,存储过程的创建,存储过程的创建,例:创建存储过程avgscore,用于根据给定的院系和班级名称计算平均成绩,并使用输出参数返回结果。(续)执行avgscore4存储过程:declareavgscorefloatexecavgscore4计算机,A,avgscoreoutputprintavgscore注意:执行存储过程时,必须带上output选项,否则不能看到输出结果,存储过程的创建,例:创建存储过程avgscore,用于根据给定的院系,按班级名称计算平均成绩,并使用输出参数返回结果。(修改)createprocedureavgscore4orgvarchar(100),-接受系名classvarchar(50),-接受班级classscorefloatoutput-接受平均成绩asdeclareorgidintsetorgid=0selectorgid=sdeptidfromsdeptwheresdeptname=orgiforgid=0beginsetscore=0print指定的院系记录不存在endelsebeginselectscore=avg(c_grade)fromstudentwheresdeptid=orgidandclassid=classgroupbyclassidselectscore平均成绩-显示平均成绩end,存储过程的创建,例:创建存储过程avgscore,用于根据给定的院系和班级名称计算平均成绩,并使用输出参数返回结果。(续)declareavgscorefloatexecavgscore4计算机,A,avgscore注意:因为在存储过程中已经有显示平均成绩的语句,在此不需要Print语句,存储过程的创建,存储过程的返回值:存储过程使用return语句返回一个状态值,返回值只能是整数例:创建存储过程avgscore1,它的功能是根据给定的院系和班级名称计算平均成绩,并将结果使用输出参数返回。如果指定的院系存在,则返回1,否则返回0。dropprocedureavgscore5Createprocedureavgscore5orgchar(100),-接受系名classchar(50),-接受班级号scorefloatoutput-接受平均分asdeclareorgidint-接受系的编号sdeptidsetorgid=0Selectorgid=sdeptidfromsdeptwheresdeptname=orgiforgid=0return0Elsebeginselectscore=avg(c_grade)fromstudentwheresdeptname=organdclassid=classgroupbyclassidreturn1end,存储过程的创建,例:创建存储过程avgscore1,它的功能是根据给定的院系和班级名称计算平均成绩,并将结果使用输出参数返回。如果指定的院系存在,则返回1,否则返回0.(续)执行avgscore5存储过程:declarescorefloat,resultintexecresult=avgscore5计算机,A,scoreoutput注意表示ifresult=1printscoreelseprint没有对应的记录,存储过程的创建,例:执行带参数的存储过程,查询大于指定岁数的学生姓名createtableperson(pnoint,namechar(10)insertintopersonvalues(20,张)createproceduresp_getstupno1intasselect*frompersonwherepnopno1执行:execsp_getstu15,存储过程的创建,创建一组同名的存储过程:组号分别为1,2,3createtablestudent1(namechar(10),ageint)insertintostudent1values(张,20)例1:createProceduresp_getstu;1aSselect*fromstudent1例2:带参数的存储过程,查询大于指定年龄的学生createproceduresp_getstu;2sageintasselect*fromstudent1whereagesage例:带输出参数的存储过程,查询指定年龄的学生createprocsp_getstu;3ageintoutput,namechar(10)outputasselectnamefromstudent1whereage=age执行:declarenamechar(10)execsp_getstu;320,nameoutput删除以上三个存储过程:dropproceduresp_getstu,查看和修改存储过程,1用企业管理器查看和修改存储过程(1)在企业管理器中展开指定的数据库,选中“存储过程”项,在右侧窗口中可以查看指定数据库中定义的存储过程,如图所示,存储过程的创建,1用企业管理器查看修改存储过程(续)(2)双击指定的存储过程,打开存储过程属性对话框,查看存储过程的定义情况。,查看和修改存储过程,2用查询分析器查看和修改存储过程(1)在查询分析器中展开指定数据库的存储过程项,可以查看到所有的存储过程。,查看和修改存储过程,2用查询分析器查看和修改存储过程(2)用鼠标右键单击要编辑的存储过程,在弹出的快捷菜单中选择“编辑”,可以在右边的窗格中显示指定存储过程的代码。,查看和修改存储过程,3使用企业管理器重命名存储过程(1)在企业管理器中,展开“数据库“;(2)选择存储过程所在的数据库,单击“存储过程”文件夹,在右侧窗格中列出所选数据库的所有存储过程;(3)单击要重命名的存储过程,选择“重命名”菜单项,即可修改存储过程名字。,查看和修改存储过程,4使用alterprocedure语句可以更改先前通过执行createprocedure语句创建的,但不会更改权限,alterprocedure语句的基本语法如下:alterprocedure存储过程名参数名数据类型【varying=默认值output,nWithrecompile|encryption|recompile,encryptionAssql语句.N各参数含义与createprocedure语句相同,查看和修改存储过程,4使用alterprocedure修改存储过程例:使用alterprocedure语句修改存储过程“asc_grade”alterprocedureasc_gradewithencryptionasupdatescsetgrade=grade+10说明:执行上述语句后,在企业管理器中查看“asc_grade”存储过程,将弹出如图所示的对话框,提示用户存储过程已经加密。,查看和修改存储过程,5使用sp_rename重命名存储过程系统存储过程sp_rename的功能是更改当前数据库中创建对象(如表,列或用户定义数据类型)的名称,使用sp_rename重命名存储过程的语法结构如下:Sp_renameobjname=对象名,newname=新对象名各参说明如下:objname=对象名:指定要重命名的存储过程的当前名称。newname=新对象名:指定存储过程的新名称。例:将存储过程asc_grade重命名为asc_grade2,则可以使用以下命令:ExecSp_renameasc_grade,asc_grade2,删除存储过程,删除存储过程的方法:(1)方法一:在企业管理器中,右击要删除的存储过程,选择”删除“命令。并确认删除。(2)方法二:用dropprocedure语句来删除存储过程,dropprocedure语句的语法结构如下:Dropprocedure存储过程名,n例:删除存储过程asc_gradedropprocedureadd_grade,删除存储过程,例:创一组存储过程,组号分别为1,2,3,求“职工工资”表的平均工资、平均奖金和平均实发工资。代码如下:createtableworker(worknochar(10),commint,salint,sal_commint)insertintoworkervalues(a1,200,1200,1400)insertintoworkervalues(a2,300,1500,1800)(1)createprocavesalary;1asselectavg(sal)fromworker(2)createprocavesalary;2asselectavg(comm)fromworker(3)createprocavesalary;3asselectavg(sal_comm)fromworker,删除存储过程,例:创一组存储过程,求“职工工资”表的平均工资、平均奖金和平均实发工资。(续)执行存储过程:execavesalary;1execavesalary;2execavesalary;3不能用下面的语句删除存储过程:dropprocedureavesalary;1dropprocedureavesalary;2dropprocedureavesalary;3注意:一组同名的存储过程只能用:“dropprocedure过程名“的方式删除,触发器概述,触发器是一种特殊的存储过程,它在指定表中的数据发生变化时自动执行。导致触发器生效的过程包含INSERT,UPDATE和delete等。触发器与普通的存储过程不同在于:触发器的执行是由事件触发的,而普通存储过程是由命令调用执行的。,触发器的优点,(1)触发器是自动执行的,不需要管理员手动维护数据库的数据完整性。(2)触发器可以对数据库中的相关表进行级联更改。如:可以在学生表中定义触发器,当用户删除学生表中的记录时,触发器将删除选课表中的对应记录。(3)触发器可以限制向表中插入无效的数据,这一点与CHECK约束的功能相似。例如:可以在选课表中定义触发器,限制插入的记录其学号字段值必须在学生表中存在对应的记录。,触发器中的inserted和deleted表,(1)触发器是在表上建立的,因此将触发器所依附的表称为触发器表。当修改表的数据而引发了触发器时,触发器将执行一系列T_SQL命令,在执行这些动作之前系统首先自动建立两个表:Deleted表和inserted表。这两个表临时驻留在内存中,其结构与触发器表完全相同,一旦触发器执行完毕,两个表随之消失。(2)可以使用Deleted表和inserted表测试某些数据修改的效果及设置触发器操作的条件,但不能直接修改这两个表中的数据。(3)Deleted表存放由于执行delete操作时从触发器表(被删除数据的表)中删除的数据行,即触发器表中需要删除的数据移到Deleted表中。(4)inserted表用于存放执行insert操作时向触发器表(被插入数据的表)中插入的数据行,即新的数据行被同时出入到两个表触发器表和inserted表中。(5)update操作相当于先执行delete操作,然后再执行insert操作,因此要用到inserted和deleted两个表,创建触发器,定义:用户定义在关系表上的一类由事件驱动的特殊过程。格式:CreatetriggerONFor|after|insteadofdelete|insert|updateAs动作体例:createtriggerstum1onstudentafterinsertasprint欢迎新同学insertintostudentvalues(16,刘,男,28,ma),创建触发器,触发器名:必须符合标示符的命名规则表名:是在其上执行触发器的表,有时也称触发器表。After:指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。如果指定FOr关键字,则AFTER是默认设置。Insteadof:指定执行触发器而不是执行触发SQL语句,从而替代触发SQL语句的操作。Delete|insert|update:是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一项。在触发器定义中允许使用以任意顺序组合的关键字。As:引入触发器要执行的操作Ifupdate(列):用于判断是否在指定的列上进行了insert或update操作(不能用于delete操作),可以指定多列。列名前不需要指定表名,因为在on子句中已经指定了表名。,例:createtriggerinsert_updateonstudentforinsert,updateasprint学生信息已经修改insertintostudent(sno,sname)values(8410078,王明),创建触发器,创建触发器,例:创建一个触发器,当向表插入、删除和更新时显示表中的记录。(1)创建表:createtabletable9(c1int,c2char(30)(2)创建一个触发器createtriggertrig1ontable9forinsert,update,deleteasselect*fromtable9(3)向表中插入数据insertintotable9values(1,林冲),创建触发器,例:创建一个触发器,检查插入的数据是否在1108之间createtabletable9(c1int,c2char(30)createtriggertrig2ontable9forinsert,updateasdeclarec1_1intselectc1_1=c1frominsertedifc1_1108beginrollbackend,创建触发器,例:创建一个触发器实现当删除学生表的记录时,同时删除选课表的该学生的选课记录。(1)createtablesc1(snochar(15),cnochar(5),gradeint)(2)insertintosc1values(2009142101,02,80)(3)insertintosc1values(2009142101,01,90)createtriggertrig4ons2fordeleteasdeletesc1wheresc1.sno=(selectsnofromdeleted)验证:deletefromsc1wheresno=2009142101,创建触发器,(1)createtableorders(goodsnamechar(15),goodsidchar(10),quantityint)(2)createtablegoods(goodsnamechar(15),goodsidchar(10),statusint,storageint)(3)插入数据insertintogoodsvalues(冰激淋,a111,1,1200)insertintogoodsvalues(小牛奶,a112,0,600),例:在Orders表中建立触发器当向Orders表中插入一条订单记录时检查goods表的货品状态status是否为1(正在整理)则不能往Orders表加入该订单,若为0,则可以加入。,创建触发器,例:在Orders表中建立触发器当向Orders表中插入一条订单记录时检查goods表的货品状态status是否为1(正在整理)则不能往Orders表加入该订单(续)(3)createtriggerorderinsertonordersafterinsertasif(selectstatusfromgoods,insertedwheregoods.goodsid=inserted.goodsid)=1beginprintthegoodsisbeingprocessedprinttheordercannotbecommittedrollbacktransaction-回滚,避免加入endinsertintoordersvalues(冰激淋,a111,120),创建触发器,例在Orders表建立一个插入触发器在添加一条订单时减少Goods表相应的货品记录中的库存。createtriggerorderinsert1onordersafterinsertasupdategoodssetstorage=storage-inserted.quantityfromgoods,insertedwheregoods.goodsid=inserted.goodsidinsertintoordersvalues(冰激淋,a111,100),创建触发器,例:在Goods表上建立删除触发器实现Goods表和Orders表的级联删除,即某种商品从goods表中删除后,应将其从orders表中删除。(1)createtriggergoods_deleteongoodsafterdeleteasdeletefromorderswheregoodsidin(selectgoodsidfromdeleted)(2)删除订单中的数据:deletefromgoodswheregoodsid=a111,创建触发器,例:在Goods表上建立删除触发器实现Goods表和Orders表的级联删除,即某种商品从goods表中删除后,应将其从orders表中删除。createtriggerdelete_goodsongoodsafterdeleteasbegindeleteordersfromorders,goodsidwheregoods.goodsid=deleted.goodsid-扩展的sqlend,创建触发器,例在Orders表建立一个插入触发器保证向Orders表插入的货品编号必须要在Goods表中一定存在。createtriggerorderinsert3onordersafterinsertasif(selectcount(*)fromgoods,insertedwheregoods.goodsid=inserted.goodsid)=0beginprintnoentryingoodsforthisorderrollbacktransactionend在orders中插入数据:insertintoordersvalues(冰激淋,a116,100),创建触发器,createtablegrades(学号char(15),班级char(15),课程号char(10),成绩int)createtabletotalgrade(学号char(15),班级char(15),总成绩int)createtablestudent(学号char(15),姓名char(20)例1:创建一个触发器,当向grades表中插入数据时,修改totalgrade表中的数据。createtriggergradeinsertongradesafterinsertasdeclareclassvarchar(15),stuidvarchar(15),-长度应该和定义表时的长度一致,否则出错gradeint,numintselectstuid=学号,class=班级,grade=成绩frominsertedselectnum=count(学号)fromtotalgradewhere学号=stuidifnum=0insertintototalgradevalues(stuid,class,grade)elseupdatetotalgradeset总成绩=总成绩+gradewhere学号=stuid,创建触发器,例:创建一个触发器,在grades表中添加或修改一条记录时,在totalgrade表中也作相应的修改。createtriggergradeupdateongradesafterupdate,insertasdeclareclassvarchar(15),stuidvarchar(15),gradeint,numintselectclass=班级,stuid=学号,grade=成绩frominsertedselectnum=count(学号)fromtotalgradewhere学号=stuidifnum=0insertintototalgradevalues(class,stuid,grade)elseupdatetotalgradeset总成绩=(selectsum(成绩)fromgradeswhere学号=stuid)where学号=stuid,创建触发器,例:当students表中的学号被修改时,另两个表中的学号也被修改。createtriggerstupdateonstudentafterupdateasdeclarenewstuidvarchar(15),oldstuidvarchar(15)selectnewstuid=学号frominsertedselectoldstuid=学号fromdeletedupdatetotalgradeset学号=newstuidwhere学号=oldstuidupdategradesset学号=newstuidwhere学号=oldstuid,创建触发器,例:创建一个触发器,向grades表中插入记录时,让触发器检查正在插入的每条记录,并与student进行比较。如果所插入记录的“学号”信息在student表中不存在,则删除该条记录。createtriggerconinsertongradesafterinsertasif(selectcount(*)fromstudent,insertedwherestudent.学号=inserted.学号)=0begindeletegradesfromgrades,insertedwheregrades.学号=inserted.学号andinserted.学号notin(select学号fromstudent)print只有与student表中学号相同的记录被插入end,创建触发器,扩展的SQL语句:/*SQL-92-Standardsubquery*/USEpubsDeletefromtitleauthorwheretitle_idin(selecttitle_idfromtitleswheretitleLIKE%computers%)/*extension*/USEpubsDeletetitleauthorfromtitleauthorinnerjointitlesontitleauthor.title_id=titles.title_idwheretitles.titlelike%computers%,创建触发器,例1:创建一个触发器,当删除表grades表中的数据时,激活触发器,并修改totalgrde表中的数据。insertintogradesvalues(2009142102,20091421,a02,93)insertintogradesvalues(2009142102,20091421,a01,86)createtriggerdelgradeongradesfordeleteasbegindeclaretotalgradeintselecttotalgrade=sum(成绩)fromgradeswhere学号=(select学号fromdeleted)updatetotalgradeset总成绩=totalgradewhere学号=(select学号fromdeleted)end,创建触发器,例:创建一个触发器,删除grades表中的数据时,totalgrade表中的数据也作相应的修改createtriggerdelgradeongradesfordeleteasbegindeclaretotalgradeint,stuidchar(15)setstuid=(select学号fromdeleted)selecttotalgrade=sum(成绩)fromgradeswhere学号=stuid-计算删除以后的总成绩updatetotalgradeset总成绩=totalgradewhere学号=stuidend,创建触发器,例:创建一个触发器,当删除student表中的学生信息时,该生的单科成绩和总成绩全部被删除。createtriggerstudentdeleteonstudentafterdeleteasdeclarestuidvarchar(15)selectstuid=学号fromdeleteddeletefromgradeswhere学号=stuiddeletefromtotalgradewhere学号=stuid,创建触发器,例:,创建触发器,例:创建一个触发器,如果在student表中插入的记录的学号和已有的学号相同,则不执行插入操作,并提示“学号相同,不可以插入”createtablestudent(snochar(15),namechar(10),sexchar(2),classchar(10),deptchar(10)insertintostudentvalues(2009142101,张,男,20091421,物理)createtriggerinsert_snoonstudentforinsertasdeclare要插入的学号char(10),numberintselectnumber=count(student.sno)fromstudent,insertedwherestudent.sno=inserted.snoifnumber=2beginprint相同,不可以插入rollbacktransactionendelsebeginprint要插入的学号select要插入的学号=snofrominsertedend,创建触发器,例:创建一个触发器,如果更新student表中的记录的学号和已有的学号相同,则不执行更新操作,并提示“学号相同,不可以更新”createtablestudent(snochar(15),namechar(10),sexchar(2),classchar(10),deptchar(10)insertintostudentvalues(2009142101,张,男,20091421,物理)createtriggerinsert_snoonstudentforupdateasdeclare更新前学号char(10)select更新前学号=snofromdeletedprint更新前学号=print更新前学号select更新前学号=student.snofromstudent,deletedwherestudent.sno=deleted.snoif更新前学号beginprint相同,不可以更新rollbacktransactionendelsebeginprint更新前学号select更新前学号=snofromdeletedprint要更新学号为:+更新前学号End,创建触发器(update),例:在xuesheng表上创建一个触发器,当修改xuesheng表上的某个记录的学号时,sc表的对应学号也作修改。createtablexuesheng(snochar(15),snamechar(10),sageint)createtablesc(snochar(15),cnochar(10),cnamechar(10)insertintoxueshengvalues(2009142101,张三,20)insertintoscvalues(2009142102,01,数据库)crea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园主题教研活动方案
- 大型活动志愿者管理方案模版
- 法律事务部合同审核流程及要点
- 农业合作社安全生产管理体系建设方案
- 职业院校电子商务专业人才培养方案
- 课程拍摄制作方案与流程说明
- 绿化种植项目实施方案模板
- 2025年汽车寄售合同纠纷案例分析
- 钢结构专项施工方案及要求
- 河道清淤施工组织管理方案
- 高中数学思政元素教学设计
- 建筑行业项目经理职业规划
- 计算国内航空货物运费国内航空货物运费的计算方法国内航空
- 招标代理工作制度及流程
- 珍爱生命远离毒品主题班会
- 沪科黔科版《综合实践活动》5上家乡“非遗”小调查
- 【MOOC】知识图谱导论-浙江大学 中国大学慕课MOOC答案
- 学校降温情况报告范文
- 【MOOC】3D工程图学-华中科技大学 中国大学慕课MOOC答案
- 中国糖尿病足诊治指南(2024)解读
- 政府推动下我国新能源汽车产业的走势
评论
0/150
提交评论