过程式数据库对象.ppt_第1页
过程式数据库对象.ppt_第2页
过程式数据库对象.ppt_第3页
过程式数据库对象.ppt_第4页
过程式数据库对象.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

第7章过程式数据库对象,7.1存储过程,7.2存储函数,7.3触发器,7.4事件,7.1存储过程,使用存储过程的优点有:(1)存储过程在服务器端运行,执行速度快。(2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。(3)确保数据库的安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。,7.1.1创建存储过程,创建存储过程可以使用CREATEPROCEDURE语句。要在MySQL5.1中创建存储过程,必须具有CREATEROUTINE权限。要想查看数据库中有哪些存储过程,可以使用SHOWPROCEDURESTATUS命令。要查看某个存储过程的具体信息,可使用SHOWCREATEPROCEDUREsp_name命令,其中sp_name是存储过程的名称。CREATEPROCEDURE的语法格式:CREATEPROCEDUREsp_name(proc_parameter,.)characteristic.routine_body其中,proc_parameter的参数如下:IN|OUT|INOUTparam_nametypecharacteristic特征如下:LANGUAGESQL|NOTDETERMINISTIC|CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA|SQLSECURITYDEFINER|INVOKER|COMMENTstring说明:sp_name:存储过程的名称,默认在当前数据库中创建。需要在特定数据库中创建存储过程时,则要在名称前面加上数据库的名称,格式为:db_name.sp_name。值得注意的是,这个名称应当尽量避免取与MySQL的内置函数相同的名称,否则会发生错误。,7.1.1创建存储过程,proc_parameter:存储过程的参数,param_name为参数名,type为参数的类型,当有多个参数的时候中间用逗号隔开。存储过程可以有0个、1个或多个参数。MySQL存储过程支持三种类型的参数:输入参数、输出参数和输入/输出参数,关键字分别是IN、OUT和INOUT。输入参数使数据可以传递给一个存储过程。当需要返回一个答案或结果的时候,存储过程使用输出参数。输入/输出参数既可以充当输入参数也可以充当输出参数。存储过程也可以不加参数,但是名称后面的括号是不可省略的。注意:参数的名字不要等于列的名字,否则虽然不会返回出错消息,但是存储过程中的SQL语句会将参数名看做列名,从而引发不可预知的结果。characteristic:存储过程的某些特征设定,下面一一介绍。LANGUAGESQL:表明编写这个存储过程的语言为SQL语言,目前来讲,MySQL存储过程还不能用外部编程语言来编写,也就是说,这个选项可以不指定。将来将会对其扩展,最有可能第一个被支持的语言是PHP。DETERMINISTIC:设置为DETERMINISTIC表示存储过程对同样的输入参数产生相同的结果,设置为NOTDETERMINISTIC则表示会产生不确定的结果。默认为NOTDETERMINISTIC。CONTAINSSQL:表示存储过程不包含读或写数据的语句。NOSQL表示存储过程不包含SQL语句。READSSQLDATA表示存储过程包含读数据的语句,但不包含写数据的语句。MODIFIESSQLDATA表示存储过程包含写数据的语句。如果这些特征没有明确给定,默认的是CONTAINSSQL。,7.1.1创建存储过程,SQLSECURITY:SQLSECURITY特征可以用来指定存储过程使用创建该存储过程的用户(DEFINER)的许可来执行,还是使用调用者(INVOKER)的许可来执行。默认值是DEFINER。COMMENTstring:对存储过程的描述,string为描述内容。这个信息可以用SHOWCREATEPROCEDURE语句来显示。routine_body:这是存储过程的主体部分,也叫做存储过程体。里面包含了在过程调用的时候必须执行的语句,这个部分总是以BEGIN开始,以END结束。当然,当存储过程体中只有一个SQL语句时可以省略BEGIN-END标志。在开始创建存储过程之前,先介绍一个很实用的命令,即DELIMITER命令。在MySQL中,服务器处理语句的时候是以分号为结束标志的。但是在创建存储过程的时候,存储过程体中可能包含多个SQL语句,每个SQL语句都是以分号为结尾的,这时服务器处理程序的时候遇到第一个分号就会认为程序结束,这肯定是不行的。所以这里使用DELIMITER命令将MySQL语句的结束标志修改为其他符号。DELIMITER语法格式为:DELIMITER$说明:$是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“#”,两个“¥”等。当使用DELIMITER命令时,应该避免使用反斜杠(“”)字符,因为那是MySQL的转义字符。,7.1.1创建存储过程,【例7.1】将MySQL结束符修改为两个斜杠“/”符号。DELIMITER/说明:执行完这条命令后,程序结束的标志就换为双斜杠符号“/”了。用下列语句检验一下:SELECT姓名FROMXSWHERE学号=081101/结果为:,要想恢复使用分号“;”作为结束符,运行下面命令即可:DELIMITER;【例7.2】下面是一个存储过程的简单例子,实现的功能是删除一个特定学生的信息。DELIMITER$CREATEPROCEDUREDELETE_STUDENT(INXHCHAR(6)BEGINDELETEFROMXSWHERE学号=XH;END$DELIMITER;说明:当调用这个存储过程时,MySQL根据提供的参数XH的值,删除对应在XS表中的数据。调用存储过程的命令是CALL命令,后面会讲到。在关键字BEGIN和END之间指定了存储过程体,当然,BEGIN-END复合语句还可以嵌套使用,下面就来介绍存储过程体的内容。,7.1.2存储过程体,1.局部变量在存储过程中可以声明局部变量,它们可以用来存储临时结果。要声明局部变量必须使用DECLARE语句。在声明局部变量的同时也可以对其赋一个初始值。DECLARE语法格式如下:DECLAREvar_name,.typeDEFAULTvalue说明:var_name为变量名;type为变量类型;DEFAULT子句给变量指定一个默认值,如果不指定默认为NULL的话。【例7.3】声明一个整型变量和两个字符变量。DECLAREnumINT(4);DECLAREstr1,str2VARCHAR(6);说明:局部变量只能在BEGINEND语句块中声明。局部变量必须在存储过程的开头就声明,声明完后,可以在声明它的BEGINEND语句块中使用该变量,其他语句块中不可以使用它。前面已经学习过用户变量,在存储过程中也可以声明用户变量,不过千万不要将这两个混淆。局部变量和用户变量的区别在于:局部变量前面没有使用符号,局部变量在其所在的BEGINEND语句块处理完后就消失了,而用户变量存在于整个会话当中。,7.1.2存储过程体,2.使用SET语句赋值要给局部变量赋值可以使用SET语句,SET语句也是SQL本身的一部分。语法格式为:SETvar_name=expr,var_name=expr.【例7.4】在存储过程中给局部变量赋值。SETnum=1,str1=hello;说明:与声明用户变量时不同,这里的变量名前面没有符号。声明用户变量的方法已经介绍过,这里不再举例。注意,例中的这条语句无法单独执行,只能在存储过程和存储函数中使用。3.SELECT.INTO语句使用这个SELECTINTO语法可以把选定的列值直接存储到变量中。因此,返回的结果只能有一行。语法格式为:SELECTcol_name,.INTOvar_name,.table_expr说明:col_name是列名,var_name是要赋值的变量名。table_expr是SELECT语句中的FROM子句及后面的部分,这里不再叙述。【例7.5】在存储过程体中将XS表中的学号为081101的学生姓名和专业名的值分别赋给变量name和project。SELECT姓名,专业名INTOname,projectFROMXS;WHERE学号=081101;,7.1.2存储过程体,4.流程控制语句在MySQL中,常见的过程式SQL语句可以用在一个存储过程体中。例如:IF语句、CASE语句、LOOP语句、WHILE语句、ITERATE语句和LEAVE语句。(1)IF语句IF-THEN-ELSE语句可根据不同的条件执行不同的操作。语法格式为:IFsearch_conditionTHENstatement_listELSEIFsearch_conditionTHENstatement_list.ELSEstatement_listENDIF说明:search_condition是判断的条件,statement_list中包含一个或多个SQL语句。当search_condition的条件为真时,就执行相应的SQL语句。IF语句不同于系统的内置函数IF()函数,IF()函数只能判断两种情况,所以请不要混淆。,7.1.2存储过程体,【例7.6】创建XSCJ数据库的存储过程,判断两个输入的参数哪一个更大。DELIMITER$CREATEPROCEDUREXSCJ.COMPAR(INK1INTEGER,INK2INTEGER,OUTK3CHAR(6)BEGINIFK1K2THENSETK3=大于;ELSEIFK1=K2THENSETK3=等于;ELSESETK3=小于;ENDIF;END$DELIMITER;说明:存储过程中K1和K2是输入参数,K3是输出参数。(2)CASE语句CASE语句在4.2.1节介绍选择列的时候已经涉及。这里介绍CASE语句在存储过程中的用法,与之前略有不同。,7.1.2存储过程体,语法格式为:CASEcase_valueWHENwhen_valueTHENstatement_listWHENwhen_valueTHENstatement_list.ELSEstatement_listENDCASE或者:CASEWHENsearch_conditionTHENstatement_listWHENsearch_conditionTHENstatement_list.ELSEstatement_listENDCASE说明:一个CASE语句经常可以充当一个IF-THEN-ELSE语句。第一种格式中case_value是要被判断的值或表达式,接下来是一系列的WHEN-THEN块,每一块的when_value参数指定要与case_value比较的值,如果为真,就执行statement_list中的SQL语句。如果前面的每一个块都不匹配就会执行ELSE块指定的语句。CASE语句最后以ENDCASE结束。第二种格式中CASE关键字后面没有参数,在WHEN-THEN块中,search_condition指定了一个比较表达式,表达式为真时执行THEN后面的语句。与第一种格式相比,这种格式能够实现更为复杂的条件判断,使用起来更方便。,7.1.2存储过程体,【例7.7】创建一个存储过程,针对参数的不同,返回不同的结果。DELIMITER$CREATEPROCEDUREXSCJ.RESULT(INstrVARCHAR(4),OUTsexVARCHAR(4)BEGINCASEstrWHENMTHENSETsex=男;WHENFTHENSETsex=女;ELSESETsex=无;ENDCASE;END$DELIMITER;【例7.8】用第二种格式的CASE语句创建以上存储过程。程序片段如下:CASEWHENstr=MTHENSETsex=男;WHENstr=FTHENSETsex=女;ELSESETsex=无;ENDCASE;,7.1.2存储过程体,(3)循环语句MySQL支持3条用来创建循环的语句:WHILE、REPEAT和LOOP语句。在存储过程中可以定义0个、1个或多个循环语句。WHILE语句语法格式为:begin_label:WHILEsearch_conditionDOstatement_listENDWHILEend_label说明:语句首先判断search_condition是否为真,不为真则执行statement_list中的语句,然后再次进行判断,为真则继续循环,不为真则结束循环。begin_label和end_label是WHILE语句的标注。除非begin_label存在,否则end_label不能被给出,并且如果两者都出现,它们的名字必须是相同的。【例7.9】创建一个带WHILE循环的存储过程。DELIMITER$CREATEPROCEDUREdowhile()BEGINDECLAREv1INTDEFAULT5;WHILEv10DOSETv1=v11;ENDWHILE;END$DELIMITER;,7.1.2存储过程体,说明:当调用这个存储过程时,首先判断v1的值是否大于零,如果大于零则执行v11,否则结束循环。REPEAT语句格式如下:begin_label:REPEATstatement_listUNTILsearch_conditionENDREPEATend_label说明:REPEAT语句首先执行statement_list中的语句,然后判断search_condition是否为真,为真则停止循环,不为真则继续循环。REPEAT也可以被标注。【例7.10】用REPEAT语句创建一个如例7.9的存储过程。程序片段如下:REPEATv1=v11;UNTILv11;ENDREPEAT;说明:REPEAT语句和WHILE语句的区别在于:REPEAT语句先执行语句,后进行判断;而WHILE语句是先判断,条件为真时才执行语句。,7.1.2存储过程体,LOOP语句语法格式如下:begin_label:LOOPstatement_listENDLOOPend_label说明:LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造,statement_list是需要重复执行的语句。在循环内的语句一直重复至循环被退出,退出时通常伴随着一个LEAVE语句。LEAVE语句经常和BEGIN.END或循环一起使用。结构如下:LEAVElabellabel是语句中标注的名字,这个名字是自定义的。加上LEAVE关键字就可以用来退出被标注的循环语句。【例7.11】创建一个带LOOP语句的存储过程。DELIMITER$CREATEPROCEDUREdoloop()BEGINSETa=10;Label:LOOPSETa=a1;IFa0THENLEAVELabel;ENDIF;ENDLOOPLabel;END$DELIMITER;,7.1.2存储过程体,说明:语句中,首先定义了一个用户变量并赋值为10,接着进入LOOP循环,标注为Label,执行减1语句,然后判断用户变量a是否小于零,是则使用LEAVE语句跳出循环。我们调用此存储过程来查看最后结果。调用该存储过程使用如下命令:CALLdoloop();接着,查看用户变量的值:SELECTa;结果为:,可以看到,用户变量a的值已经变成1了。循环语句中还有一个ITERATE语句,它只可以出现在LOOP、REPEAT和WHILE语句内,意为“再次循环”。它的格式为:ITERATElabel说明:该语句格式与LEAVE差不多,区别在于:LEAVE语句是离开一个循环,而ITERATE语句是重新开始一个循环。,7.1.2存储过程体,在存储过程中处理SQL语句可能导致一条错误消息。例如,向一个表中插入新的行而主键值已经存在,这条INSERT语句会导致一个出错消息,并且MySQL立即停止对存储过程的处理。每一个错误消息都有一个唯一代码和一个SQLSTATE代码。例如,SQLSTATE23000属于如下的出错代码:Error1022,Cantwrite;duplicatekeyintableError1048,ColumncannotbenullError1052,ColumnisambiguousError1062,DuplicateentryforkeyMySQL手册的“错误消息和代码”一章中列出了所有的出错消息及它们各自的代码。为了防止MySQL在一条错误消息产生时就停止处理,需要使用到DECLAREHANDLER语句。DECLAREHANDLER语句为错误代码声明了一个所谓的处理程序,它指明:对一条SQL语句的处理如果导致一条错误消息,将会发生什么。DECLAREHANDLER语法格式为:DECLAREhandler_typeHANDLERFORcondition_value,.sp_statement,7.1.2存储过程体,其中,handler_type为:CONTINUE|EXIT|UNDOcondition_value为:SQLSTATEVALUEsqlstate_value|condition_name|SQLWARNING|NOTFOUND|SQLEXCEPTION|mysql_error_code说明:handler_type:处理程序的类型,主要有三种:CONTINUE、EXIT和UNDO。对CONTINUE处理程序,MySQL不中断存储过程的处理。对于EXIT处理程序,当前BEGIN.END复合语句的执行被终止。UNDO处理程序类型语句暂时还不被支持。condition_value:给出SQLSTATE的代码表示。condition_name是处理条件的名称,接下来会讲到。SQLWARNING是对所有以01开头的SQLSTATE代码的速记。NOTFOUND是对所有以02开头的SQLSTATE代码的速记。SQLEXCEPTION是对所有没有被SQLWARNING或NOTFOUND捕获的SQLSTATE代码的速记。当用户不想为每个可能的出错消息都定义一个处理程序时可以使用以上三种形式。,7.1.2存储过程体,mysql_error_code是具体的SQLSTATE代码。除了SQLSTATE值,MySQL错误代码也被支持,表示的形式为:ERROR=xxxx。sp_statement:处理程序激活时将要执行的动作。【例7.12】创建一个存储过程,向XS表插入一行数据(081101,王民,计算机,1,1990-02-10,50,NULL,NULL),已知学号081101在XS表中已存在。如果出现错误,程序继续进行。USEXSCJ;DELIMITER$CREATEPROCEDUREMY_INSERT()BEGINDECLARECONTINUEHANDLERFORSQLSTATE23000SETx2=1;SETx=2;INSERTINTOXSVALUES(081101,王民,计算机,1,1990-02-10,50,NULL,NULL);SETx=3;END$DELIMITER;,调用存储过程查看结果的语法格式为:CALLMY_INSERT();SELECTX;结果为:,7.1.2存储过程体,说明:在调用存储过程后,未遇到错误消息时处理程序未被激活,当执行INSERT语句出现出错消息时,MySQL检查是否为这个错误代码定义了处理程序。如果有,则激活该处理程序,本例中,INSERT语句导致的错误消息刚好是SQLSTATE代码中的一条。接下来执行处理程序的附加语句(SETx2=1)。此后,MySQL检查处理程序的类型,这里的类型为CONTINUE,因此存储过程继续处理,将用户变量x赋值为3。如果这里的INSERT语句能够执行,处理程序将不被激活,用户变量x2将不被赋值。注意:不能为同一个出错消息在同一个BEGIN-END语句块中定义两个或更多的处理程序。为了提高可读性,可以使用DECLARECONDITION语句为一个SQLSTATE或出错代码定义一个名字,并且可以在处理程序中使用这个名字。DECLARECONDITION语法格式为:DECLAREcondition_nameCONDITIONFORcondition_value其中,condition_value:SQLSTATEVALUEsqlstate_value|mysql_error_code,7.1.2存储过程体,说明:condition_name是处理条件的名称,condition_value为要定义别名的SQLSTATE或出错代码。【例7.13】修改例7.12中的存储过程,将SQLSTATE23000定义成NON_UNIQUE,并在处理程序中使用这个名称。程序片段为:BEGINDECLARENON_UNIQUECONDITIONFORSQLSTATE23000;DECLARECONTINUEHANDLERFORNON_UNIQUESETx2=1;SETx=2;INSERTINTOXSVALUES(081101,王民,计算机,1,1990-02-10,50,NULL,NULL);SETx=3;END;6.游标一条SELECT.INTO语句返回的是带有值的一行,这样可以把数据读取到存储过程中。但是常规的SELECT语句返回的是多行数据,如果要处理它需要引入游标这一概念。MySQL支持简单的游标。在MySQL中,游标一定要在存储过程或函数中使用,不能单独在查询中使用。,7.1.2存储过程体,使用一个游标需要用到4条特殊的语句:DECLARECURSOR(声明游标)、OPENCURSOR(打开游标)、FETCHCURSOR(读取游标)和CLOSECURSOR(关闭游标)。如果使用了DECLARECURSOR语句声明了一个游标,这样就把它连接到了一个由SELECT语句返回的结果集中。使用OPENCORSOR语句打开这个游标。接着,可以用FETCHCURSOR语句把产生的结果一行一行地读取到存储过程或存储函数中去。游标相当于一个指针,它指向当前的一行数据,使用FETCHCORSOR语句可以把游标移动到下一行。当处理完所有的行时,使用CLOSECURSOR语句关闭这个游标。(1)声明游标语法格式:DECLAREcursor_nameCURSORFORselect_statement说明:cursor_name是游标的名称,游标名称使用与表名同样的规则。select_statement是一个SELECT语句,返回的是一行或多行的数据。这个语句声明一个游标,也可以在存储过程中定义多个游标,但是一个块中的每一个游标必须有唯一的名字。注意:这里的SELECT子句不能有INTO子句。,7.1.2存储过程体,下面的定义符合一个游标声明:DECLAREXS_CUR1CURSORFORSELECT学号,姓名,性别,出生日期,总学分FROMXSWHERE专业名=计算机;注意:游标只能在存储过程或存储函数中使用,例中语句无法单独运行。(2)打开游标声明游标后,要使用游标从中提取数据,就必须先打开游标。在MySQL中,使用OPEN语句打开游标,其格式为:OPENcursor_name在程序中,一个游标可以打开多次,由于其他的用户或程序本身已经更新了表,所以每次打开结果可能不同。(3)读取数据游标打开后,就可以使用FETCHINTO语句从中读取数据。语法格式:FETCHcursor_nameINTOvar_name,var_name.说明:FETCH.INTO语句与SELECT.INTO语句具有相同的意义,FETCH语句是将游标指向的一行数据赋给一些变量,子句中变量的数目必须等于声明游标时SELECT子句中列的数目。var_name是存放数据的变量名。,7.1.2存储过程体,(4)关闭游标游标使用完以后,要及时关闭。关闭游标使用CLOSE语句,格式为:CLOSEcursor_name语句参数的含义与OPEN语句中相同。例如:CLOSEXS_CUR2将关闭游标XS_CUR2。【例7.14】创建一个存储过程,计算XS表中行的数目。DELIMITER$CREATEPROCEDUREcompute(OUTNUMBERINTEGER)BEGINDECLAREXHCHAR(6);DECLAREFOUNDBOOLEANDEFAULTTRUE;DECLARENUMBER_XSCURSORFORSELECT学号FROMXS;DECLARECONTINUEHANDLERFORNOTFOUNDSETFOUND=FALSE;SETNUMBER=0;OPENNUMBER_XS;FETCHNUMBER_XSINTOXH;WHILEFOUNDDOSETNUMBER=NUMBER+1;FETCHNUMBER_XSINTOXH;ENDWHILE;CLOSENUMBER_XS;END$DELIMITER;,7.1.2存储过程体,调用此存储过程并查看结果:CALLcompute(num);SELECTnum;结果为:,说明:这个例子也可以直接使用COUNT函数来解决,这里只是为了说明如何使用一个游标而已。,7.1.3调用存储过程,存储过程创建完后,可以在程序、触发器或者存储过程中被调用,但是都必须使用到CALL语句,前面已经简单地介绍了CALL语句的形式,本节重点介绍它。语法格式:CALLsp_name(parameter,.)说明:sp_name为存储过程的名称,如果要调用某个特定数据库的存储过程,则需要在前面加上该数据库的名称。parameter为调用该存储过程使用的参数,这条语句中的参数个数必须总是等于存储过程的参数个数。【例7.15】创建存储过程,实现查询XS表中学生人数的功能,该存储过程不带参数。USEXSCJ;CREATEPROCEDUREDO_QUERY()SELECTCOUNT(*)FROMXSORDERBY学号;调用该存储过程:CALLDO_QUERY();结果为:,7.1.3调用存储过程,说明:通常SELECT语句不会被直接用在存储过程中。【例7.16】假设例7.6中的存储过程已经创建,调用该存储过程。CALLCOMPAR(3,6,K);SELECTK;结果为:,说明:3和6相当于输入参数K1和K2,用户变量K相当于输出参数K3。可以看到,由于36,输出参数K的值就为“小于”。前面创建的存储过程都是比较简单的,下面结合一些比较复杂的例子来学习如何调用存储过程。,7.1.3调用存储过程,【例7.17】创建一个存储过程,有两个输入参数:XH和KCM,要求当某学生某门课程的成绩小于60分时将其学分修改为零,大于等于60分时将学分修改为此课程的学分。DELIMITER$CREATEPROCEDUREXSCJ.DO_UPDATE(INXHCHAR(6),INKCMCHAR(16)BEGINDECLAREKCHCHAR(3);DECLAREXFTINYINT;DECLARECJTINYINT;SELECT课程号,学分INTOKCH,XFFROMKCWHERE课程名=KCM;SELECT成绩INTOCJFROMXS_KCWHERE学号=XHAND课程号=KCH;IFCJ=60THENUPDATEXSSET总学分=总学分+XFWHERE学号=NEW.学号;ENDIF;END$DELIMITER;说明:本例结果自行验证。在触发器中还可以调用存储过程。【例7.32】假设XSCJ数据库中有一个与XS表结构完全一样的表STUDENT,创建一个触发器,在XS表中添加数据的时候,调用存储过程,将STUDENT表中的数据与XS表同步。,7.3.1创建触发器,首先,定义存储过程:DELIMITER$CREATEPROCEDURECHANGES()BEGINREPLACEINTOSTUDENTSELECT*FROMXS;END$接着创建触发器:CREATETRIGGERSTUDENT_CHANGEAFTERINSERTONXSFOREACHROWCALLCHANGES();DELIMITER;验证:INSERTINTOXSVALUES(091101,王大庆,计算机,1,1990-08-14,48,NULL,NULL);SELECT*FROMSTUDENT;结果STUDENT表中数据已经和XS表相同,为了XS表和STUDENT的数据真正同步,还可以定义一个UPDATE触发器和DELETE触发器。,7.3.2触发器的删除,和其他数据库对象一样,使用DROP语句即可将触发器从数据库中删除。语法格式:DROPTRIGGERschema_name.trigger_name说明:trigger_name:指要删除的触发器名称。schema_name为所在数据库的名称,如果在当前数据库,可以省略。【例7.33】删除触发器XS_DELETE。

温馨提示

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

评论

0/150

提交评论