《第7章存储过程和触发器课件.ppt》由会员分享,可在线阅读,更多相关《第7章存储过程和触发器课件.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、7.17.2存存 储储 过过 程程触触 发发 器器使用存储过程的优点如下:(1)存储过程在服务器端运行,执行速度快。(2)存储过程执行一次后,就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。(3)使用存储过程可以完成所有数据库操作,并可通过编程方式控制对数据库信息访问的权限,确保数据库的安全。(4)自动完成需要预先执行的任务。存储过程可以在SQLServer启动时自动执行,而不必在系统启动后再进行手工操作,大大方便了用户的使用,可以自动完成一些需要预先执行的任务。在SQLServer2008中有下列几种类型的存储过程。(1)系统存储过
2、程。系统存储过程是由SQLServer提供的存储过程,可以作为命令执行。系统存储过程定义在系统数据库master中,其前缀是“sp_”,例如,常用的显示系统对象信息的sp_help系统存储过程,为检索系统表的信息提供了方便快捷的方法。(2)扩展存储过程。扩展存储过程是指在SQLServer2008环境之外,使用编程语言(如C+语言)创建的外部例程形成的动态链接库(DLL)。使用时,先将DLL加载到SQLServer2008系统中,并且按照使用系统存储过程的方法执行。扩展存储过程在SQLServer实例地址空间中运行。但因为扩展存储过程不易撰写,而且可能会引发安全性问题,所以微软可能会在未来的S
3、QLServer中删除这一功能,本书将不详细介绍扩展存储过程。(3)用户存储过程。在SQLServer2008中,用户存储过程可以使用T-SQL语言编写,也可以使用CLR方式编写。在本书中,T-SQL存储过程就称为存储过程。1使用命令方式创建存储过程使用命令方式创建存储过程创建存储过程的语句是CREATEPROCEDURE或CREATEPROC,两者同义。语法格式:CREATEPROC|PROCEDURE架构名.过程名;组号/*定义过程名*/参数类型架构名.数据类型/*定义参数的类型*/VARYING=defaultOUT|OUTPUTREADONLY/*定义参数的属性*/,.WITH,./*
4、定义存储过程的处理方式*/FORREPLICATIONAS;./*执行的操作*/|EXTERNALNAME程序集名.类名.方法名;1)命令主体)命令主体CREATEPROCEDURE命令主体结构说明如下:(1)过程名:用于指定存储过程名,必须符合标识符规则,且对于数据库及所在架构必须唯一。(2);组号:为可选的整数,用于对同名的存储过程进行分组,以便使用一条DROPPROCEDURE语句就可删除一组存储过程(3)参数:为存储过程的形参,符号作为第一个字符来指定参数名称。(4)数据类型:用于指定形参的数据类型,形参可为SQLServer2008支持的任何类型,但cursor类型只能用于OUTPU
5、T参数,如果指定参数的数据类型为cursor,则必须同时指定VARYING和OUTPUT关键字,OUT与OUTPUT关键字意义相同。(5)VARYING:指定作为输出参数支持的结果集。(6)default:指定存储过程输入参数的默认值,默认值必须是常量或NULL。(7)OUTPUT:指示参数为输出参数,输出参数可以从存储过程返回信息。(8)READONLY:指定不能在存储过程的主体中更新或修改参数。(9):用于定义存储过程的处理方式。(10)FORREPLICATION:用于说明不能在订阅服务器上执行为复制创建的存储过程,如果指定了FORREPLICATION,则无法声明参数。(11)SQL语
6、句:代表过程体包含的T-SQL语句,存储过程体中可以包含一条或多条T-SQL语句,除了DCL、DML与DDL命令外,还能包含过程式语句,如变量的定义与赋值、流程控制语句等。(12)EXTERNALNAME:指定.NETFramework程序集的方法,以便CLR存储过程引用。2)过程选项)过程选项的具体格式为::=ENCRYPTIONRECOMPILEEXECUTEAS子句(1)ENCRYPTION:指定SQLServer对CREATEPROCEDURE语句的原始文本进行加密。对于CLR存储过程,这个选项不可用。(2)RECOMPILE:指定数据库引擎不缓存该过程的计划,该过程在运行时编译。(3
7、)EXECUTEAS子句:指定在其中执行存储过程的安全上下文。3)注意事项)注意事项(1)用户定义的存储过程只能在当前数据库中创建(临时存储过程除外,它总是在系统数据库tempdb中创建)。存储过程名称存储在sysobjects系统表中,而语句的文本存储在syscomments中。(2)SQLServer启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员在master数据库中创建,并在sysadmin固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。(3)CREATEPROCEDURE的权限默认授予sysadmin固定服务器角色成员、db_owner和db_ddla
8、dmin固定数据库角色成员。sysadmin固定服务器角色成员和db_owner固定数据库角色成员可以将CREATEPROCEDURE权限转让给其他用户。(4)SQL语句的限制。如下语句必须使用对象的架构名对数据库对象进行限定:CREATETABLE、ALTERTABLE、DROPTABLE、TRUNCATETABLE、CREATEINDEX、DROPINDEX、UPDATESTATISTICS及DBCC语句。如下语句不能出现在CREATEPROCEDURE定义中:SETPARSEONLY、SETSHOWPLAN_TEXT、SETSHOWPLAN_XML、SETSHOWPLAN_ALL、CRE
9、ATESCHEMA、CREATEFUNCTION、ALTERFUNCTION、CREATEPROCEDURE、ALTERPROCEDURE、CREATETRIGGER、ALTERTRIGGER、CREATEVIEW、ALTERVIEW、USE数据库名等。2存储过程的执行存储过程的执行通过EXECUTE或EXEC命令可以执行一个已定义的存储过程,EXEC是EXECUTE的简写。语法格式:EXEC|EXECUTE返回状态=模块名;组号|模块名变量参数名=值|变量OUTPUT|DEFAULT,.WITHRECOMPILE;1)语句说明)语句说明(1)返回状态:为可选的整型变量,保存存储过程的返回状态
10、。EXECUTE语句使用该变量前,必须对其声明。(2)模块名:要调用的存储过程或用户定义标量函数的完全限定或者不完全限定名称。“组号”用于调用已定义的一组存储过程中的某一个。(3)模块名变量:局部定义的变量名,保存存储过程或用户定义函数的名称。(4)参数名:为CREATEPROCEDURE或CREATEFUNCTION语句中定义的参数名,“值”为实参。如果省略“参数名”,则后面的实参顺序要与定义时参数的顺序一致。(5)变量:为局部变量,用于保存OUTPUT参数返回的值。(6)DEFAULT:DEFAULT关键字表示不提供实参,而是使用对应的默认值。(7)WITHRECOMPILE:执行模块后,
11、强制编译、使用和放弃新计划。2)注意事项)注意事项存储过程的执行要注意以下几点:(1)如果存储过程名的前缀为“sp_”,SQLServer会首先在master数据库中寻找符合该名称的系统存储过程。如果没能找到合法的过程名,SQLServer才会寻找架构名称为dbo的存储过程。(2)在执行存储过程时,若语句是批处理中的第一个语句,则不一定要指定EXECUTE关键字。3)举例)举例(1)设计简单的存储过程。【例7.1】返回081101号学生的成绩情况。该存储过程不使用任何参数。USEPXSCJGOCREATEPROCEDUREstudent_infoASSELECT*FROMCJBWHERE学号=
12、081101GO存储过程定义后,执行存储过程student_info:EXECUTEstudent_info如果该存储过程是批处理中的第一条语句,则可使用:student_info执行结果如图7.1所示。(2)使用带参数的存储过程。【例7.2】从PXSCJ数据库的三个表中查询某人指定课程的成绩和学分。该存储过程接收与传递参数精确匹配的值。USEPXSCJGOCREATEPROCEDUREstudent_info1namechar(8),cnamechar(16)ASSELECTa.学号,姓名,课程名,成绩,t.学分FROMXSBaINNERJOINCJBbONa.学号=b.学号INNERJOI
13、NKCBtONb.课程号=t.课程号WHEREa.姓名=nameandt.课程名=cnameGO执行存储过程student_info1:EXECUTEstudent_info1王林,计算机基础执行结果如图7.2所示。以下命令的执行结果与上面的相同:EXECUTEstudent_info1name=王林,cname=计算机基础或者:DECLAREprocchar(20)SETproc=student_info1EXECUTEprocname=王林,cname=计算机基础(3)使用带OUPUT参数的存储过程。【例7.3】创建一个存储过程do_insert,作用是向XSB表中插入一行数据。创建另外一
14、个存储过程do_action,在其中调用第一个存储过程,并根据条件处理该行数据,处理后输出相应的信息。第一个存储过程:CREATEPROCEDUREdbo.do_insertASINSERTINTOXSBVALUES(091201,陶伟,1,1990-03-05,软件工程,50,NULL);第二个存储过程:CREATEPROCEDUREdo_actionXbit,STRCHAR(8)OUTPUTASBEGINEXECdo_insertIFX=0BEGINUPDATEXSBSET姓名=刘英,性别=0WHERE学号=091201SETSTR=修改成功ENDELSEIFX=1BEGINDELETEF
15、ROMXSBWHERE学号=091201SETSTR=删除成功ENDEND接下来执行存储过程do_action来查看结果:DECLAREstrchar(8)EXECdbo.do_action0,strOUTPUTSELECTstr;执行结果如图7.3所示。(4)使用带有通配符参数的存储过程。【例7.4】从三个表的连接中返回指定学生的学号、姓名、所选课程名称及该课程的成绩。该存储过程在参数中使用了模式匹配,如果没有提供参数,则使用预设的默认值。CREATEPROCEDUREst_infonamevarchar(30)=李%ASSELECTa.学号,a.姓名,c.课程名,b.成绩FROMXSBaI
16、NNERJOINCJBbONa.学号=b.学号INNERJOINKCBcONc.课程号=b.课程号WHERE姓名LIKEnameGO执行存储过程:EXECUTEst_info/*参数使用默认值*/或者:EXECUTEst_info王%/*传递给name的实参为王%*/(5)使用OUTPUT游标参数的存储过程。OUTPUT游标参数用于返回存储过程的局部游标。【例7.5】在PXSCJ数据库的XSB表上声明并打开一个游标。CREATEPROCEDUREst_cursorst_cursorcursorVARYINGOUTPUTASSETst_cursor=CURSORFORWARD_ONLYSTATI
17、CFORSELECT*FROMXSBOPENst_cursor在如下的批处理中,声明一个局部游标变量,执行上述存储过程,并将游标赋值给局部游标变量,然后通过该游标变量读取记录。DECLAREMyCursorcursorEXECst_cursorst_cursor=MyCursorOUTPUT/*执行存储过程*/FETCHNEXTFROMMyCursorWHILE(FETCH_STATUS=0)BEGINFETCHNEXTFROMMyCursorENDCLOSEMyCursorDEALLOCATEMyCursor(6)使用WITHENCRYPTION选项。WITHENCRYPTION子句用于对用
18、户隐藏存储过程的文本。【例7.6】创建加密过程,使用sp_helptext系统存储过程获取关于加密过程的信息,然后尝试直接从syscomments表中获取关于该过程的信息。CREATEPROCEDUREencrypt_thisWITHENCRYPTIONASSELECT*FROMXSB通过系统存储过程sp_helptext可显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。执行如下语句:EXECsp_helptextencrypt_this结果集为提示信息“对象encrypt_this的文本已加密”。使用ALTERPROCEDURE命令可修改已存在的存储过程并保留以前赋予的
19、许可。语法格式:ALTERPROC|PROCEDURE架构名.过程名;组号参数类型架构名.数据类型VARYING=defaultOUTPUT,.WITH,.FORREPLICATIONAS;.|EXTERNALNAME程序集名.类名.方法名;【例7.7】对例7.2中创建的存储过程student_info1进行修改,将第一个参数改成学生的学号。USEPXSCJGOALTERPROCEDUREstudent_info1numberchar(6),cnamechar(16)ASSELECT学号,课程名,成绩FROMCJB,KCBWHERECJB.学号=numberANDKCB.课程名=cnameGO
20、【例7.8】创建名为select_students的存储过程,在默认情况下,该存储过程可查询所有学生信息,随后授予权限。当该存储过程需更改为能检索计算机专业的学生信息时,用ALTERPROCEDURE命令重新定义该存储过程。创建select_students存储过程:CREATEPROCEDUREselect_students/*创建存储过程*/ASSELECT*FROMXSBORDERBY学号GO修改存储过程select_students:ALTERPROCEDUREselect_studentsWITHENCRYPTIONASSELECT*FROMXSBWHERE专业=计算机ORDERBY
21、学号GO当不再使用一个存储过程时,就要把它从数据库中删除。使用DROPPROCEDURE语句可永久地删除存储过程。在此之前,必须确认该存储过程没有任何依赖关系。语法格式:DROPPROC|PROCEDURE架构名.过程,.说明:过程是指要删除的存储过程或存储过程组的名称。USEPXSCJGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname=student_info)DROPPROCEDUREstudent_info1创建存储过程创建存储过程例如,如果要通过图形向导方式定义一个存储过程来查询PXSCJ数据库中每个同学各门功课的成绩,那么其主要步骤如下:启动“S
22、QLServerManagementStudio”,在“对象资源管理器”中展开“数据库”“PXSCJ”,选择其中的“可编程性”,右击“存储过程”,在弹出的快捷菜单中选择“新建存储过程”菜单项,打开“存储过程脚本编辑”窗口,如图7.4所示。2执行存储过程执行存储过程在PXSCJ数据库的“存储过程”目录下选择要执行的存储过程,如student_info1,右击鼠标,选择“执行存储过程”菜单项。在弹出的“执行过程”窗口中会列出存储过程的参数形式,如果“输出参数”栏为“否”,则表示该参数为输入参数,用户需要设置输入参数的值,在“值”一栏中输入即可,如图7.5所示。3修改存储过程修改存储过程在“存储过程
23、”目录下选择要修改的存储过程,右击鼠标,在弹出的快捷菜单中选择“修改”菜单项,打开“存储过程脚本编辑”窗口,在该窗口中修改相关的T-SQL语句。修改完成后,执行修改后的脚本,若执行成功,则修改了存储过程。4删除存储过程删除存储过程选择要删除的存储过程,右击鼠标,在弹出的快捷菜单中选择“删除”菜单项,根据提示删除该存储过程。7.2.1 触发器的类型触发器的类型1DML触发器触发器当数据库中发生数据操纵语言(DML)事件时将调用DML触发器。一般情况下,DML事件包括对表或视图的INSERT语句、UPDATE语句和DELETE语句,因而DML触发器也可分为三种类型:INSERT、UPDATE和DE
24、LETE。利用DML触发器可以方便地保持数据库中数据的完整性。例如,对于PXSCJ数据库有XSB表、CJB表和KCB表,当插入某一学号的学生某一课程的成绩时,该学号应是XSB表中已存在的,课程号应是KCB表中已存在的,此时,可通过定义INSERT触发器实现上述功能。通过DML触发器可以实现多个表间数据的一致性。2DDL触发器触发器DDL触发器也是由相应的事件触发的,但DDL触发器触发的事件是数据定义语句(DDL)。这些语句主要是以CREATE、ALTER、DROP等关键字开头的语句。DDL触发器的主要作用是执行管理操作,如审核系统、控制数据库的操作等。通常情况下,DDL触发器主要用于以下一些操
25、作需求:防止对数据库架构进行某些修改;希望数据库中发生某些变化以利于相应数据库架构中的更改;记录数据库架构中的更改或事件。DDL触发器只在响应由T-SQL语法所指定的DDL事件时才会触发。1创建创建DML触发器触发器语法格式:CREATETRIGGER架构名.触发器名ON表|视图/*指定操作对象*/WITHENCRYPTION/*说明是否采用加密方式*/FOR|AFTER|INSTEADOFINSERT,UPDATE,DELETEWITHAPPENDNOTFORREPLICATION/*说明该触发器不用于复制*/ASSQL语句;.|EXTERNALNAME程序集名.类名.方法名1)语句说明)语
26、句说明(1)触发器名:用于指定触发器名,触发器名必须符合标识符规则,并且在数据库中必须唯一。“架构名”是DML触发器所属架构的名称。对于DDL触发器,无法指定架构名。(2)表|视图:指在其上执行触发器的表或视图,有时称为触发器表或触发器视图。(3)AFTER:用于说明触发器在指定操作都成功执行后触发,如AFTERINSERT表示向表中插入数据时激活触发器。不能在视图上定义AFTER触发器。(4)INSTEADOF:指定用DML触发器中的操作代替触发语句的操作。(5)INSERT,UPDATE,DELETE:指定激活触发器的语句的类型,必须至少指定一个选项。在触发器定义中允许使用上述选项的任意顺
27、序组合。(6)WITHAPPEND:指定应该再添加一个现有类型的触发器。(7)SQL语句:触发器的T-SQL语句,可以有一条或多条语句,指定DML触发器触发后将要执行的动作。2)触发器说明)触发器说明触发器有以下几点说明:(1)触发器中使用的特殊表。执行触发器时,系统创建了两个特殊的临时表inserted表和deleted表,下面介绍一下这两个表的内容。inserted表:当向表中插入数据时,INSERT触发器触发执行,新的记录插入到触发器表和inserted表中。deleted表:用于保存已从表中删除的记录,当触发一个DELETE触发器时,被删除的记录存放到deleted表中。(2)创建DM
28、L触发器的说明。创建DML触发器时主要有以下几点说明:CREATETRIGGER语句必须是批处理中的第一条语句,并且只能应用到一个表中。DML触发器只能在当前的数据库中创建,但可以引用当前数据库的外部对象。创建DML触发器的权限默认分配给表的所有者。在同一CREATETRIGGER语句中,可以为多种操作(如INSERT和UPDATE)定义相同的触发器操作。不能对临时表或系统表创建DML触发器。对于含有DELETE或UPDATE操作定义的外键表,不能使用INSTEADOFDELETE和INSTEADOFUPDATE触发器。TRUNCATETABLE语句虽然能够删除表中的记录,但它不会触发DELE
29、TE触发器。在触发器内可以指定任意的SET语句,所选择的SET选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。DML触发器最大的用途是返回行级数据的完整性,而不是返回结果,所以应当尽量避免返回任何结果集。CREATETRIGGER权限默认授予定义触发器的表所有者、sysadmin固定服务器角色成员、db_owner和db_ddladmin固定数据库角色成员,并且不可转让。DML触发器中不能包含以下语句:ALTERDATABASE、CREATEDATABASE、DROPDATABASE、LOADDATABASE、LOADLOG、RECONFIGURE、RESTOREDATABASE
30、、RESTORELOG。(3)创建INSERT触发器。INSERT触发器是当对触发器表执行INSERT语句时就会激活的触发器。INSERT触发器可以用来修改,甚至拒绝接收正在插入的记录。【例7.10】创建一个表table1,其中只有一列a。在表上创建一个触发器,每次插入操作时,将变量str的值设为“TRIGGERISWORKING”并显示。USEPXSCJGOCREATETABLEtable1(aint)GOCREATETRIGGERtable1_insertONtable1AFTERINSERTASBEGINDECLAREstrchar(50)SETstr=TRIGGERISWORKINGP
31、RINTstrEND向table1中插入一行数据:INSERTINTOtable1VALUES(10)执行结果如图7.6所示。【例7.11】创建触发器,当向CJB表中插入一个学生的成绩时,将XSB表中该学生的总学分加上添加的课程的学分。CREATETRIGGERcjb_insertONCJBAFTERINSERTASBEGINDECLAREnumchar(6),kc_numchar(3)DECLARExfintSELECTnum=学号,kc_num=课程号frominsertedSELECTxf=学分FROMKCBWHERE课程号=kc_numUPDATEXSBSET总学分=总学分+xfWHE
32、RE学号=numPRINT修改成功END(4)创建UPDATE触发器。UPDATE触发器在对触发器表执行UPDATE语句后触发。在执行UPDATE触发器时,将触发器表的原记录保存到deleted临时表中,将修改后的记录保存到inserted临时表中。【例7.12】创建触发器,当修改XSB表中的学号时,同时也要将CJB表中的学号修改成相应的学号(假设XSB表和CJB表之间没有定义外键约束)。CREATETRIGGERxsb_updateONXSBAFTERUPDATEASBEGINDECLAREold_numchar(6),new_numchar(6)SELECTold_num=学号FROMde
33、letedSELECTnew_num=学号FROMinsertedUPDATECJBSET学号=new_numWHERE学号=old_numEND接着修改XSB表中的一行数据,并查看触发器执行结果:UPDATEXSBSET学号=081120WHERE学号=081101GOSELECT*FROMCJBWHERE学号=081120执行结果如图7.7所示。(5)创建DELETE触发器。【例7.13】在删除XSB表中的一条学生记录时将CJB表中该学生的相应记录也删除。CREATETRIGGERxsb_deleteONXSBAFTERDELETEASBEGINDELETEFROMCJBWHERE学号IN
34、(SELECT学号FROMdeleted)END【例7.14】在KCB表中创建UPDATE和DELETE触发器,当修改或删除KCB表中的课程号字段时,同时修改或删除CJB表中的该课程号。CREATETRIGGERkcb_trigONKCBAFTERUPDATE,DELETEASBEGINIF(UPDATE(课程号)UPDATECJBSET课程号=(SELECT课程号FROMinserted)WHERE课程号=(SELECT课程号FROMdeleted)ELSEDELETEFROMCJBWHERE课程号IN(SELECT课程号FROMdeleted)END(6)创建INSTEADOF触发器。AF
35、TER触发器是在触发语句执行后触发的,与AFTER触发器不同的是,INSTEADOF触发器触发时只执行触发器内部的SQL语句,而不执行激活该触发器的SQL语句。一个表或视图中只能有一个INSTEADOF触发器。【例7.15】创建表table2,值包含一列a,在表中创建INSTEADOFINSERT触发器,当向表中插入记录时显示相应消息。USEPXSCJGOCREATETABLEtable2(aint)GOCREATETRIGGERtable2_insertONtable2INSTEADOFINSERTASPRINTINSTEADOFTRIGGERISWORKING向表中插入一行数据:INSER
36、TINTOtable2VALUES(10)执行结果如图7.8所示。【例7.16】在PXSCJ数据库中创建视图stu_view,包含学生学号、专业、课程号、成绩。该视图依赖于表XSB和CJB,是不可更新视图。可以在视图上创建INSTEADOF触发器,当向视图中插入数据时分别向表XSB和CJB插入数据,从而实现向视图插入数据的功能。创建视图:CREATEVIEWstu_viewASSELECTXSB.学号,专业,课程号,成绩FROMXSB,CJBWHEREXSB.学号=CJB.学号创建INSTEADOF触发器:CREATETRIGGERInsteadTrigONstu_viewINSTEADOFI
37、NSERTASBEGINDECLAREXHchar(6),XMchar(8),ZYchar(12),KCHchar(3),CJintSETXM=佚名SELECTXH=学号,ZY=专业,KCH=课程号,CJ=成绩FROMinsertedINSERTINTOXSB(学号,姓名,专业)VALUES(XH,XM,ZY)INSERTINTOCJBVALUES(XH,KCH,CJ)END向视图插入一行数据:INSERTINTOstu_viewVALUES(091102,计算机,101,85)查看数据是否插入:SELECT*FROMstu_viewWHERE学号=091102执行结果如图7.9所示。查看与视
38、图关联的XSB表的情况:SELECT*FROMXSBWHERE学号=091102执行结果如图7.10所示。2创建创建DDL触发器触发器语法格式:CREATETRIGGER触发器名ONALLSERVER|DATABASEWITHENCRYPTIONFOR|AFTER事件类型|事件组,.ASSQL语句;.|EXTERNALNAME程序集名.类名.方法名【例7.17】创建PXSCJ数据库作用域的DDL触发器,当删除一个表时,提示禁止该操作,然后回滚删除表的操作。USEPXSCJGOCREATETRIGGERsafetyONDATABASEAFTERDROP_TABLEASPRINT不能删除该表ROL
39、LBACKTRANSACTION尝试删除表table1:DROPTABLEtable1执行结果如图7.11所示。【例7.18】创建服务器作用域的DDL触发器,当删除一个数据库时,提示禁止该操作并回滚删除数据库的操作。CREATETRIGGERsafety_serverONALLSERVERAFTERDROP_DATABASEASPRINT不能删除该数据库ROLLBACKTRANSACTION要修改触发器执行的操作,可以使用ALTERTRIGGER语句。(1)修改DML触发器的语法格式:ALTERTRIGGER架构名.触发器名ON(表|视图)WITHENCRYPTION(FOR|AFTER|IN
40、STEADOF)DELETE,INSERT,UPDATENOTFORREPLICATIONASSQL语句;.|EXTERNALNAME程序集名.类名.方法名(2)修改DDL触发器的语法格式:ALTERTRIGGER触发器名ONDATABASE|ALLSERVERWITHENCRYPTIONFOR|AFTER事件类型,.|事件组ASSQL语句;|EXTERNALNAME程序集名.类名.方法名;【例7.19】修改PXSCJ数据库中在XSB表上定义的触发器xsb_delete,将其修改为UPDATE触发器。USEPXSCJGOALTERTRIGGERxsb_deleteONXSBFORUPDATEA
41、SPRINT执行的操作是修改触发器本身是存在于表中的,因此,当表被删除时,表中的触发器也将一起被删除。删除触发器使用DROPTRIGGER语句。语法格式:DROPTRIGGER架构名.触发器名,.;/*删除DML触发器*/DROPTRIGGER触发器名,.ONDATABASE|ALLSERVER;/*删除DDL触发器*/【例7.20】删除DML触发器xsb_delete。IFEXISTS(SELECTnameFROMsysobjectsWHEREname=xsb_delete)DROPTRIGGERxsb_delete【例7.21】删除DDL触发器safety。DROPTRIGGERsafet
42、yONDATABASE1创建触发器创建触发器(1)通过界面方式只能创建DML触发器。以在表XSB上创建触发器为例,利用“对象资源管理器”创建DML触发器的步骤如下:启动“SQLServerManagementStudio”,在“对象资源管理器”中展开“数据库”“PXSCJ”“表”“dbo.XSB”,选择其中的“触发器”目录,在该目录下可以看到之前已经创建的XSB表的触发器。右击“触发器”,在弹出的快捷菜单中选择“新建触发器”菜单项。在打开的“触发器脚本编辑”窗口输入相应的创建触发器的命令。输入完成后,单击“执行”按钮,若执行成功,则触发器创建完成。(2)查看DDL触发器。DDL触发器不可以使用
43、界面方式创建,DDL触发器分为数据库触发器和服务器触发器,展开“数据库”“PXSCJ”“可编程性”“数据库触发器”,可以查看到有哪些数据库触发器。展开“数据库”“服务器对象”“触发器”,可以查看到有哪些服务器触发器。2修改触发器修改触发器DML触发器能够使用界面方式修改,DDL触发器则不可以。进入“对象资源管理器”,修改触发器的步骤与创建的步骤相同,在“对象资源管理器”中选择要修改的触发器,右击鼠标,在弹出的快捷菜单中选择“修改”菜单项,打开“触发器脚本编辑”窗口,在该窗口中可以进行触发器的修改,修改后单击“执行”按钮重新执行即可。但是被设置成“WITHENCRYPTION”的触发器是不能被修改的。3删除触发器删除触发器(1)删除DML触发器。以XSB表的DML触发器为例,在“对象资源管理器”中展开“数据库”“PXSCJ”“表”“dbo.XSB”“触发器”,选择要删除的触发器名称,右击鼠标,在弹出的快捷菜单中选择“删除”菜单项,在弹出的“删除对象”窗口中单击“确定”按钮,即可完成触发器的删除操作。(2)删除DDL触发器。删除DDL触发器与删除DML触发器的方法类似,首先找到要删除的触发器,右击鼠标,选择“删除”选项即可。