触发器操作参考_第1页
触发器操作参考_第2页
触发器操作参考_第3页
触发器操作参考_第4页
全文预览已结束

下载本文档

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

文档简介

ASP.NET通过触发器对数据进行操作触发器是一种特殊的存储过程,它针对数据表进行操作。当数据表进行更新操作时,在触发器内指定的操作就会自动执行。下面以SQLServer数据库为例,介绍如何通过触发器操作数据库中的数据。触发器与视图和存储过程一样被广泛应用于数据库的应用开发中,它不但可以提高查询速度,减少查询开销,而且,可以辅助实现安全策略,提供更高的安全保证,保证数据不会被非法窃取,这是程序开发人员必须掌握的一项基本技术。在应用程序当中应用触发器可以代替繁琐的程序代码,完成相应的功能。由于触发器可以查询其他表,而且可以包含复杂的Transact-SQL语句,所以可以实现强制性的、复杂的业务规则或要求。触发器实质是一种特殊的存储过程,但是它与表却是紧密联系的,离开了表它将不复存在(这点与约束十分类似)。触发器又不像存储过程那样需要调用才能执行,而是在对表中数据进行增、删、改(INSERT,UPDATE,DELETE)操作时被触发而执行。触发器可以包含复杂的T-SQL语句。在触发器内设置回滚,可以将触发它的语句所在的事务全部回滚,这样检测到错误时可以回滚事务以撤消错误。在SQLServer中使用触发器的优点可概括如下。(1)触发器可以实现外键约束的功能,实现对表的级联修改。(2)触发器可以实现核查约束的功能,而且其功能更为强大。(3)如果对表中数据进行了增删改的操作,使用触发器可以根据修改前后的差异,采取对应的对策。(4)允许在一个表中针对不同的增删改操作设置多个触发器,以完成各类不同任务。触发器在SQLServer中的基本应用可大体概括为Insert型触发器、Update型触发器、Delete型触发器、嵌套型触发器和递归触发器。当用户在对某个表执行插入操作时,对向该表插入的所有行来说,需要保存一个相应的副本,此时,可定义一个Insert型触发器的表,即定义一个插入表。插入表就是用来存储向原表插入的内容。同样道理,对于一个定义了Delete型触发器的表来讲,一旦对某表执行了删除操作,则将所有删除行放至删除表中。这样做的目的是,一旦触发器遇到了强迫它中止的语句被执行时,删除的那些行可以从删除表中得以恢复。触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其他表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见,触发器所参照的其他表的位置决定了操作要花费的时间长短。需要强调的是,在使用Update型触发器时,更新操作包括两个部分,即先将更新的内容去掉,然后将新值插入。因此,对于一个定义了Update型触发器的表来讲,当进行更新操作时,在删除表中存放了旧值,然后在插入表中存放新值。在查询分析器里建立一个Update触发器,其语法如下createtableemployeePay_delbak--删除员工工资表(employeelDintprimarykey,employeePaymoney)gocreatetableemployeePay_insbak--插入员工工资表(employeeIDintprimarykey,employeePaymoney)Go/*更新员工工资触发器*/usetestifexists(SELECTnamefromsysobjectswherename='更新员工工资'andxtype='TR')droptrigger更新员工工资GOcreatetrigger更新员工工资onemployeePayforupdateAS/*将删除的数据行备份到employeePay_delbak删除表中*/insertintoemployeePay_delbakselect火fromdeleted/*将新插入的数据行备份到employeePay_insbak插入表中*/insertintoemployeePay_insbakselect火frominsertedgoupdateemployeePaysetemployeePay=4300whereemployeeID=1001goselect火fromemployeePaygoselect火fromemployeePay_delbakgoselect火fromemployeePay_insbakgo创建完触发器后,应用程序的开发步骤如下。(1)新建一个ASP.NET网站,命名为Trigger,Web页默认名为Default.aspx。(2)在Web页Default.aspx中添加一个Panel其中放4个textBox控件,一个Button控件,用于输入员工注册信息;再添加一个Panel其中两个GridView控件和一个Button控件,显示员工信息表、员工工资表和关闭窗口。(3)主要程序代码如下:双击“注册提交”按钮触发该按钮的Click事件,在该事件中执行对数据库的添加操作;双击“关闭”按钮触发该按钮的Click事件,在该事件中执行关闭窗口操作。部分参考代码:if(IDcount>0){Response.Write("<scriptlanguage=javascript>alert('对不起,编号已存在,请重新输入!')</script>");return;}else{try{com.CommandText=。。。com.ExecuteNonQuery();Response.Write("<scriptlanguage=javascript>alert('插入成功,注册完成')〈/script〉”);。。。〃显示员工信息表〃显示员工工资表。。。}catch(Exceptionerror){Response.Write(error.Message.ToString());}finally{con.Close();}}}protectedvoidcencel_Click(objectsender,EventArgse){Response.Write("<scriptlanguage=javascript>window.close()</script>");创建触发器用createtrigger:注意:触发器名称是不加引号的。如下是一个示例,当在titles表上更改记录时,发送邮件通知MaryM。createtriggerreminderontitlesforinsert,updata,deleteasexecmasterxp_sendmail'MaryM','Don''tforgettoprintareportforthedistributors.'重命名触发器execsp_rename原名称,新名称sp_rename是SQLServer自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。删除触发器droptrigger触发器名称也可以同时删除多个触发器:droptrigger触发器名称,触发器名称...注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:ifExists(selectnamefromsysobjectswherename=’触发器名称'andxtype='TR')如何查看某个触发器的内容use数据库名goexecsp_helptext触发器名称将会以表的样式显示触发器内容。除了触发器外,sp_helptext还可以显示规则、默认值、未加密的存储过程、用户定义函数、视图的文本如何查看当前数据库中有哪些触发器use数据库名goselect*fromsysobjectswherextype='TR'sysobjects保存着数据库的对象,其中xtype为TR的记录即为触发器对象。在name一列,我们可以看到触发器名称。存储过程查看触发器的属性:sp_help触发器名称sp_helptrigger有两个参数:第一个参数为表名;第二个为触发器类型,为char(6)类型,可以是INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。例:use数据库名goexecsp_helptriggertbl触发器更多语法INSTEADOF执行触发器语句,但不执行触发触发器的SQL语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行delete语句。例:createtriggerfontblinsteadofdeleteasinsertintoLogs...IFUPDATE(歹U名)检查是否更新了某一列,用于insert或update,不能用于delete。例:createtriggerfontblforupdateasifupdate(status)orupdate(title)sql_statement--更新了status或title列Iinserted、deleted这是两个虚拟表,inserted保存的是insert或update之后所影响的记录形成的表,deleted保存的是delete或update之前所影响的记录形成的表。例:createtriggertbl_deleteontblfordeleteasdeclare@titlevarchar(200)select@title=titlefromdeletedinsertintoLogs(logContent)values(删除了title为:’+title+'的记录')说明:如果向inserted或deleted虚拟表中取字段类型为text、image的字段值时,所取得的值将会是null。触发器回滚我们知道许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的,如果直接打开数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。use数据库名gocreatetriggertron表名forupdateasifupdate(userName)rollbacktran关键在最后两句,其解释为:如果更新了userName歹L就回滚事务。递归、嵌套触发器递归触发

温馨提示

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

评论

0/150

提交评论