第8章 存储过程和触发器_第1页
第8章 存储过程和触发器_第2页
第8章 存储过程和触发器_第3页
第8章 存储过程和触发器_第4页
第8章 存储过程和触发器_第5页
已阅读5页,还剩118页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章存储过程和触发器存储过程概述8.1存储过程的创建8.2执行存储过程8.3存储过程的参数8.4存储过程的返回值8.5存储过程的查看、修改和删除8.6触发器的概念8.7

触发器的创建8.8触发器的使用8.9

触发器的修改及删除8.108.1存储过程概述8.1.1存储过程的基本概念存储过程是独立存在于表之外的数据库对象,由被编译在一起的一组Transact-SQL语句组成。它可以被客户调用,也可以被另一个存储过程或触发器调用,它的参数可以被传递,它的出错代码也可以被检验。

在SQLServer中,使用存储过程的优点如下:①存储过程在服务器端运行,执行速度快。②存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。③确保数据库的安全。使用存储过程可以完成所有的数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。④自动完成需要预先执行的任务。存储过程可以在系统启动时自动执行,而不必在系统启动后再进行手工操作,大大方便了用户的使用,可以自动完成一些需要预先执行的任务。8.1.2存储过程的类型SQLServer支持五种类型的存储过程:系统存储过程、本地存储过程、临时存储过程、远程存储过程和扩展存储过程。在不同情况下需要执行不同的存储过程。1.系统存储过程

系统存储过程是由系统提供的存储过程,可以作为命令执行各种操作。系统存储过程定义在系统数据库master中,其前缀是sp_。2.本地存储过程

本地存储过程是指在用户数据库中创建的存储过程,这种存储过程完成特定数据库操作任务,其名称不能以sp_为前缀。3.临时存储过程

临时存储过程属于本地存储过程。如果本地存储过程的名称前面有一个“#”,该存储过程就称为局部临时存储过程,这种存储过程只能在一个用户会话中使用;如果本地存储过程的名称前有两个“##”,该过程就是全局临时存储过程,这种存储过程可以在所有用户会话中使用。4.远程存储过程

远程存储过程指从远程服务器上调用的存储过程。5.扩展存储过程

在SQLServer环境之外执行的动态链接库称为扩展存储过程,其前缀是sp_。使用时需要先加载到SQLServer系统中,并且按照使用存储过程的方法执行。8.2存储过程的创建

默认情况下,用户创建的存储过程归数据库所有者拥有,数据库的所有者可以把许可授权给其他用户。

存储过程由CREATEPROCEDURE语句创建,存储过程的定义包括:过程名和参数的说明以及过程体,即包含执行存储过程操作的Transact-SQL语句。要使用存储过程,首先要创建一个存储过程。8.2.1使用CREATEPROCEDURE语句创建1.语法格式CREATEPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][…n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[…n]2.参数说明procedure_name:新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须惟一。如果要创建局部临时过程,可以在procedure_name前面加一个编号符#,要创建全局临时过程,可以在procedure_name前面加两个编号符##。完整的名称包括(#或##)不能超过128个字符。指定过程所有者的名称是可选的。number:是可选的整数,用来对同名的过程分组,以便用一条[DROPPROCEDURE]语句即可将同组的过程一起除去。@parameter:过程中的参数。在[CREATEPROCEDURE]语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有2100个参数。使用@符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其他过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其他数据库对象的名称。data_type:参数的数据类型。所有数据类型(包括text、ntext和image)均可以用作存储过程的参数。不过,cursor数据类型只能用于[OUTPUT]语句的参数。如果指定的数据类型为cursor,也必须同时指定[VARYING]和[OUTPUT]关键字。说明:对于可以是cursor数据类型的输出参数,没有最大数目的限制。VARYING:指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。default:参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或[NULL]。如果过程将对该参数使用[LIKE]关键字,那么默认值中可以包含通配符(%、_、[]和^)。OUTPUT:表明参数是返回参数。该选项的值可以返回给[EXEC[UTE]。使用[OUTPUT]参数可将信息返回给调用过程。text、ntext和image类型数据可用作[OUTPUT]参数。使用[OUTPUT]关键字的输出参数可以走游标占位符。n:表示最多可以指定2100个参数的占位符。RECOMPILE|ENCRYPTION|(RECOMPILE,ENCRYPTION):RECOMPILE表明SQLServer不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,应该使用[RECOMPILE]选项。ENCRYPTION表示SQLServer加密syscomments表中包含CREATEPROCEDURE语句文本的条目。使用ENCRYPTION可防止将过程作为SQLServer复制的一部分发布。说明:在升级过程中,SQLServer利用存储在syscomments中的加密注释来重新创建加密过程。FORREPLICATION:指定不能在订阅服务器上执行为复制创建的存储过程。使用[FORREPLICATION]选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。该选项不能和[WITHRECOMPILE]选项一起使用。AS:指定过程要执行的操作。sql_statement:过程中要包含的任意数目和类型的Transact-SQL语句,但有一些限制。ASsql_statement[…n]:其中的[n]是表示此过程可以包含多条Transact-SQL语句的占位符。3.注意事项①用户定义的存储过程只能在当前数据库中创建(临时过程除外,临时过程总是在tempdb中创建)。②成功执行CREATEPROCEDURE语句后,过程名称存储在sysobjects系统表中,而CREATEPROCEDURE语句的文本存储在syscomments中。③自动执行存储过程。SQLServer启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员在master数据库中创建,并在sysadmin固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。④sql_statement的限制。除了SETSHOWPLANTEXT和SETSHOWPLANALL外,其他SET语句均可在存储过程内使用。

必须使用对象所有者名对数据库对象进行限定的语句有:CREATETABLE、ALTERTABLE、DROPTABLE、TRUNCATETABLE、CREATEINDEX、DROPINDEX、UPDATESTATISTICS及DBCC语句。⑤权限。CREATEPROCEDURE的权限默认授予sysadmin固定服务器角色成员、db_owner和db_ddladmin固定数据库角色成员。sysadmin固定服务器角色成员和dlowner固定数据库角色成员可以将CREATEPROCEDURE权限转让给其他用户。USEStudent--检查是否已存在同名的存储过程,若有,则删除。IFEXISTS(SELECTnameFROMsysobjectsWHEREname='stu_info_pro'ANDtype='P')DROPPROCEDUREstu_info_proGO--创建存储过程CREATEPROCEDUREstu_info_proASSELECTstudent_Name,student_Sex,addressFROMStudent_InfoGOEXECstu_info_pro8.2.2使用企业管理器创建(1)打开企业管理器,展开服务器组,并展开相应的服务器。(2)打开“数据库”文件夹,并打开要创建存储过程的数据库。(3)选择“存储过程”选项,右击鼠标,执行“新建存储过程”命令,打开创建存储过程对话框如图8-2所示。图8-2创建存储过程对话框(4)在“文本”列表框中显示了CREATEPROCEDURE语句的框架,可以修改要创建的存储过程的名称,然后加入存储过程所包含的SQL语句。(5)单击“检查语法”按钮,可以检查创建存储过程的SQL语句的语法是否正确。(6)如果要将其设置为下次创建存储过程的模板,可单击“另存为模板”按钮。(7)完成后,单击“确定”按钮即可创建一个存储过程。8.2.3使用向导创建

(1)在企业管理器中,执行“工具”下拉菜单中的“向导”命令,打开“选择向导”对话框。(2)在“数据库”文件夹选择“创建存储过程”向导,单击“确定”按钮,出现“创建存储过程向导”欢迎对话框。(3)单击“下一步”按钮,出现选择数据库对话框,如图8-3所示。(4)在“数据库名称”下拉列表中选择数据库后,单击“下一步”按钮,出现选择存储过程对话框,如图8-4所示。图8-3选择数据库对话框图8-4选择存储过程对话框(5)单击“下一步”按钮,出现完成创建存储过程对话框。若单击“完成”按钮,即可完成存储过程的创建。(6)单击“编辑”按钮,可编辑存储过程,如图8-6所示。图8-5完成创建存储过程对话框图8-6编辑存储过程对话框(7)单击“编辑SQL”按钮,即可打开“编辑存储过程SQL”对话框,其中的列表框显示了创建该存储过程的Transact-SQL语句。可以在已有的Transact-SQL语句的基础上进行编辑,也可以单击“分析”按钮来执行语法检查。如图8-7所示。图8-7“编辑存储过程SQL”对话框(8)单击“确定”按钮,返回到图8-5所示的对话框,再单击“确定”按钮即可。8.3执行存储过程1.语法格式[[EXEC[UTE]]{[@return_status=]{procedure_name[;number]|@procedure_name_var}[[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]}[,…n][WITHRECOMPILE]2.参数说明@return_status:一个可选的整型变量,保存存储过程的返回状态。此变量在用于EXECUTE语句前,必须在批处理、存储过程或函数中已声明。procedure_name:调用的存储过程名称。number:可选的整数,用于将相同名称的过程进行组合,使得它们可以用一句DROPPROCEDURE语句除去。该参数不能用于扩展存储过程。在同一应用程序中使用的过程一般都以该方式组合。@procedure_name_var:局部定义变量名,代表存储过程名称。@parameter:过程参数,在[CREATEPROCEDURE]语句中定义。参数名称前必须加上符号@。在以“@parameter_name=value”格式使用时,参数名称和常量不一定按照[CREATEPROCEDURE]语句中定义的顺序出现。但是,如果有一个参数使用“@parameter_name=value”格式,则其他所有参数都必须使用这种格式。

默认情况下,参数可为空。如果传递NULL参数值,且该参数用于CREATE或ALTERTABLE语句中不允许为NULL的列(例如,插入至不允许为NULL的列),SQLServer就会报错。为避免将NULL参数值传递给不允许为NULL的列,可以在过程中添加程序设计逻辑或采用默认值(使用CREATE或ALTERTABLE语句中的DEFAULT关键字)。value:过程中参数的值。如果参数名称没有指定,参数值必须以CREATEPROCEDURE语句中定义的顺序给出。@variable:用来保存参数或者返回参数的变量。OUTPUT:指定存储过程必须返回一个参数。该存储过程的匹配参数也必须由关键字OUTPUT创建。使用游标变量作参数时使用该关键字。

DEFAULT:根据过程的定义提供参数的默认值。当过程需要的参数值没有事先定义好默认值或缺少参数或指定了[DEFAULT]关键字,就会出错。n:占位符,表示在它前面的项目可以多次重复执行。例如,EXCUTE语句可以指定一个或者多个@parameter、value或@variable。WITHRECOMPILE:强制编译新的计划。如果所提供的参数为非典型参数或者数据有很大的改变,使用该选项,在以后的程序执行中使用更改过的计划。该选项不能用于扩展存储过程。建议尽量少使用该选项,因为它消耗较多的系统资源。3.注意事项①如果存储过程名的前三个字符为sp_,SQLServer会在Master数据库中寻找该过程。如果没能找到合法的过程名,SQLServer会寻找所有者名称为dbo的过程。②参数可以通过value或@parametername:value提供。③执行存储过程时,若语句是批处理中的第一个语句,则不一定要指定EXECUTE关键字。8.4存储过程的参数8.4.1参数传递方式1.顺序法在传递参数时,使传递的参数和定义时的参数顺序一致,对于使用默认值的参数可以用DEFAULT值代替。USEStudentGoCREATEPROCEDUREAdd_class(@class_idint,@class_namechar(20),@directorchar(10),@professionchar(14))ASINSERTINTOclass_infoVALUES(@class_id,@class_name,@director,@profession)EXECAdd_class200202,'计算机应用022','张波','计算机应用'select*fromclass_infoUSEStudentIFEXISTS(SELECTnameFROMsysobjectsWHEREname='stu_score_pro'ANDtype='P')DROPPROCEDUREstu_score_proGoCREATEPROCEDUREstu_score_pro@snamechar(10),@cnamechar(10)ASSELECTa.student_name,c.course_name,c.course_start,b.result,c.course_scoreFROMstudent_infoaJOINresult_infobONa.student_id=b.student_idJOINcourse_infocONb.course_no=c.course_noWHEREc.course_name=@cnameanda.student_name=@snameEXECstu_score_pro'陈白露','马克思主义'2.提示法

在传递参数时,采用提示的方法,如“@class_id=200202”的形式,此时,各个参数的顺序可以任意排列。EXECAdd_class@class_id=200202,@class_name='计算机应用022',@director='张波',@profession='计算机应用'EXECAdd_class@class_name='计算机应用022',@class_id=200202,@profession='计算机应用',@director='张波'8.4.2使用默认参数

创建存储过程时,可以为参数提供一个默认值,默认值必须为常量或者NULL。USEStudentGoCREATEPROCEDUREAdd_class@class_idint,@class_namechar(20),@directorchar(10)='无',@professionchar(14)='无'ASINSERTINTOclass_infoVALUES(@class_id,@class_name,@director,@profession)EXECAdd_class200202,'计算机应用022'Goselect*fromclass_infoGo8.4.3使用带OUTPUT的返回参数

在创建存储过程时,可以定义返回参数。在执行存储过程时,可以将结果返回给返回参数。USEStudentGoCREATEPROCEDUREQuery_student(@student_idint,@student_namechar(10)OUTPUT,@addressvarchar(50)OUTPUT)ASSELECT@student_name=student_name,@address=addressFROMstudent_infoWHEREstudent_id=@student_idDECLARE@student_namechar(10)DECLARE@addressvarchar(50)EXECQuery_student20000203,@student_nameOUTPUT,@addressOUTPUTSELECT'姓名'=@student_name,'家庭住址'=@addressGO8.5存储过程的返回值

存储过程在执行后都会返回一个整型值。如果执行成功,则返回0;否则返回−1~99之间的数值。8.5.1RETURN语句1.语法RETURN[整数表达式]2.功能从查询或过程中无条件退出。[RETURN]语句可在任何时候从过程、批处理或语句块中退出,不执行位于[RETURN]之后的语句。3.说明①[整数表达式]:返回的整型值。存储过程可以给调用过程或应用程序返回整型值。②在建立存储过程的时候,需要定义任意的出错条件,并把它们与整型的出错代码联系起来。③用于存储过程时,[RETURN]不能返回空值。如果过程试图返回空值,系统将生成警告信息并返回0值。USEStudentGoCREATEPROCEDUREtest_return(@input_numint=0)ASIF@input_num=0RETURN0IF@input_num>0RETURN1IF@input_num<0RETURN-18.5.2捕获存储过程的返回值

若要正确接收存储过程的返回值,可使用EXECUTE语句。1.语法EXECUTE@return_status=procedure_name2.功能

执行存储过程,将RETURN语句返回的值送状态变量@return_status。3.说明

在执行EXECUTE语句之前,首先要声名变量@return_status。DECLARE@ret_numintEXEC@ret_num=test_return100SELECT'返回值'=@ret_numGO8.6存储过程的查看、修改和删除8.6.1存储过程的查看1.使用sp_helptext查看存储过程EXECsp_helptexttest_return2.使用企业管理器(1)打开企业管理器,展开服务器组,并展开相应的服务器;(2)打开数据库文件夹,然后选择存储过程所在的数据库“student”;(3)打开“存储过程”文件夹,在右侧详细信息窗格中右击存储过程add_class,执行“属性”命令,打开“存储过程属性”对话框,如图8-13所示;图8-13存储过程属性对话框(4)可以在此对话框中,直接修改存储过程的定义,也可以设置存储过程的权限。完成后,单击“确定”按钮即可。8.6.2存储过程的修改

修改存储过程使用ALTERPROCEDURE语句。1.功能更改先前通过执行CREATEPROCEDURE语句创建的存储过程,但不会更改权限,也不影响相关的存储过程或触发器。2.语法ALTERPROC[EDURE]procedure_name[;number][{@parameterdata_type}[VARYING][=default][OUTPUT]][,…n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[…n]3.说明

各参数含义与CREATEPROCEDURE命令相同。如果原来的过程定义是用WITHENCRYPTION或WITHRECOMPILE创建的,那么只有在ALTERPROCEDURE中也包含这些选项时,这些选项才有效。ALTERPROCEDURE权限默认授予sysadmin固定服务器角色成员、db_owner和db_ddladmin固定数据库角色成员以及过程的所有者且不可转让。用ALTERPROCEDURE更改后,过程的权限和启动属性保持不变。8.6.3存储过程的删除1.通过企业管理器删除在要删除的存储过程中右击鼠标,然后执行“删除”命令,在弹出的对话框中单击“全部除去”按钮即可。2.通过DROPPROCEDURE语句来完成语法格式:

DROPPROCEDURE{procedure}[,…n]功能:从当前数据库中删除一个或多个存储过程或存储过程组。参数含义:①procedure:指要删除的存储过程或存储过程组的名称;②n:表示可以指定多个存储过程同时删除。③默认情况下,将DROPPROCEDURE权限授予过程所有者,该权限不可转让。db_owner和db_ddladmin固定数据库角色成员和sysadmin固定服务器角色成员可以通过在DROPPROCEDURE内指定所有者删除任何对象。

DROPPROCEDUREtest_return8.7触发器的概念

触发器是一种特殊类型的存储过程,它不能显示地被调用,它是在指定的表中插入记录、更改记录或者删除记录时,被自动激活。所以,触发器可以用来对表实施复杂的完整性约束,当触发器所保护的数据发生改变时,触发器会自动被激活,从而防止对数据的不正确的修改。

在触发器中可以查询其他表,也可以查询其他更复杂的T-SQL语句。触发器和引起触发器执行的T-SQL语句被当作一次事务处理,因此可以在触发器中回滚这个事务。

如果发现引起触发器执行的T-SQL语句执行了一个非法操作,则可以通过回滚事务使语句不能执行,回滚后SQLServer会自动返回到此事务执行前的状态。8.8触发器的创建8.8.1使用企业管理器创建触发器(1)打开企业管理器,展开服务器组,并展开相应的服务器。(2)打开“数据库”文件夹,选择要创建触发器的数据库。(3)选择“表”文件夹,然后在要创建触发器的表上右击鼠标,执行“所有任务”子菜单下的“管理触发器”命令,打开“触发器属性”对话框。在此对话框中的“文本”列表框中,输入用于创建触发器的Transact-SQL语句。单击“检查语法”按钮可以检查SQL语句的语法是否正确。注意:如果在“名称”文本框中选择已经创建的触发器,则单击下面的“删除”按钮即可删除该触发器。(4)输入完成后,单击“确定”按钮,即可创建触发器。8.8.2使用Transact-SQL语句创建触发器1.语法格式CREATETRIGGERtrigger_nameON{table|view}[WITHENCRYPTION]{{{FOR|AFTER|INSTEADOF}{[DELETE][,][INSERT][,][UPDATE]}[NOTFORREPLICATION]AS[{IFUPDATE(column)[{AND|OR}UPDATE(column)][…n]|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask){comparison_operator}column_bitmask[…n]}]sql_statement[…n]}}2.参数说明参数trigger_name用于指定触发器名。触发器名必须符合标识符规则,并且在数据库中必须惟一,可以包含触发器所有者名。

tablelview是触发器表或触发器视图,即在其上执行触发器的表或视图。有时,可以包含表或视图的所有者名。关键字WITHENCRYPTION可防止将触发器作为SQLServer复制的一部分发布。

AFTER关键字用于说明触发器在指定操作都成功执行后触发,AFTER是默认设置,不能在视图上定义AFTER触发器。INSTEADOF指定用触发器中的操作代替触发语句的操作,在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEADOF触发器。如果触发器表存在约束,则在INSTEADOF触发器执行之后和AFTER触发器执行之前检查这些约束。如果违反了约束,则回滚INSTEADOF触发器操作且不执行AFTER触发器,INSTEADOF触发器不能在WITHCHECKOPTION可更新视图上定义。关键字DELETE、INSERT和UPDATE用于指定在表或视图上执行这一操作时将激活相应的触发器,必须指定一项或多项,项与项之间用逗号分隔。关键字选项NOTFORREPLICATION指该触发器对于复制进程无效。IFUPDATE(column)子句用于测试在指定的列上进行的INSERT或UPDATE操作,不能用于DELETE操作;UPDATE(column)中的column为表或者视图中的列名称,说明这一列的数据是否被INSERT或者UPDATE操作修改过。如果修改过,则返回TRUE,否则返回FALSE。IF(COLUMNS_UPDATED())子句用于测试是否插入或更新了指定的列。返回的二进制位数据,表示插入或更新了表中的哪些列,若对应位为0,表示没有插入或更新;若对应位为1,表示对该列进行了插入或更新。关于表文件的列与二进制位的对应关系为:如果表的列从左向右分别为C0,C1,C2,C3,C4…则分别对应二进制位的第0位、第1位、第2位、第3位、第4位……依此类推。

如果在表上创建的触发器包含8列以上,则COLUMNS_UPDATED()返回多个字节。在INSERT操作中,COLUMNS_UPDATED将对所有列返回TRUE值,IF(COLUMNS_UPDATED())仅用于INSERT或UPDATE触发器。bitwise_opemtor为用于比较运算的位运算符。updated_bitmask为整型的位屏蔽码,假定该表上有UPDATE触发器,若要检查列C1、C2、C4是否都有更新,可指定updated_bitmask的值为00010110(即22);若要检查是否只有列C1有更新,可指定updated_bitmask的值为00000010(即2)。comparison_operator为比较运算符。使用等号(=)检查updated_bitmask中指定的所有列是否都实际进行了更新。使用大于号(>)检查update_bitmask中指定的任一列或某些列是否已更新。

column_bitmask为列屏蔽码,用来检查是否已更新或插入了对应列。参数sql_statement为触发器的T-SQL语句,当执行DELETE、INSERT或UPDATE操作时,对应的触发器操作将生效。

n表示触发器中可以包含多条T-SQL语句。USEStudentGO/*如果表B1存在,则删除*/IFEXISTS(SELECTnameFROMsysobjectsWHEREname='B1')DROPTABLEB1GOCREATETABLEB1(student_numberint,student_namechar(30))GO/*如果触发器Query1_B1存在,则删除*/IFEXISTS(SELECTnameFROMsysobjectsWHEREname='Query1_B1'ANDtype='TR')DROPTRIGGERQuery1_B1GO/*创建触发器Query1_B1*/CREATETRIGGERQuery1_B1ONB1FORINSERT,UPDATE,DELETEASSELECT*FROMB1GOINSERTB1VALUES(200401,'张山')8.9触发器的使用8.9.1inserted表和deleted表

在触发器执行的时候,会产生两个临时表:inserted表和deleted表。它们的结构和触发器所在的表的结构相同,SQLServer2000自动创建和管理这些表。可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。inserted表用于存储INSERT和UPDATE语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到inserted表和触发器表中。inserted表中的行是触发器表和新行的副本。deleted表用于存储DELETE和UPDATE语句所影响的行的复本。在执行DELETE或UPDATE语句时,行从触发器表中删除,并传输到deleted表中。delete表和触发器表通常没有相同的行。执行INSERT操作:插入到触发器表中的新行被插入到inserted表中。执行DELETE操作:从触发器表中删除的行被插入到deleted表中。执行UPDATE操作:先从触发器表中删除旧行,然后再插入新行。其中被删除的旧行被插入到deleted表中,插入的新行被插入到inserted表中。/*如果触发器Query2_B1存在,则删除*/IFEXISTS(SELECTnameFROMsysobjectsWHEREname='Query2_B1'ANDtype='TR')DROPTRIGGERQuery2_B1GO/*创建触发器Query2_B1*/CREATETRIGGERQuery2_B1ONB1FORINSERT,UPDATE,DELETEASSELECT*FROMinsertedSELECT*FROMdeletedGOUPDATEB1SETstudent_name='张峰'WHEREstudent_number=2004018.9.2INSERT触发器和UPDATE触发器

当向表中插入或者更新记录时,INSERT或者UPDATE触发器被执行。一般情况下,这两种触发器常用来检查插入或者修改后的数据是否满足要求。USEStudentIFEXISTS(SELECTnameFROMsysobjectsWHEREname='check_insert'ANDtype='TR')DROPTRIGGERcheck_insertGOCREATETRIGGERcheck_insertONresult_infoFORINSERTASIFEXISTS(SELECT*FROMinsertedaWHEREa.student_idNOTIN(SELECTb.student_idFROMstudent_infob)ORa.course_noNOTIN(SELECTc.course_noFROMcourse_infoc))BEGINRAISERROR('违背数据的完整性',16,1)ROLLBACKTRANSACTION/*回滚事务*/ENDinsertresult_infoVALUES('020',20040101,'31',20)USEStudentGO/*检查是否存在score表,若存在,则删除*/IFEXISTS(SELECTnameFROMsysobjectsWHEREname='score')DROPTABLEscoreGO/*创建score表*/CREATETABLEscore(student_noint,scoreint)/*检查是否存在check_score触发器,若存在,则删除*/IFEXISTS(SELECTnameFROMsysobjectsWHEREname='check_score'ANDtype='TR')DROPTRIGGERche

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论