仓酷云

标题: MYSQL教程之SQL 2000中的触发器利用 [打印本页]

作者: 小魔女    时间: 2015-1-16 22:32
标题: MYSQL教程之SQL 2000中的触发器利用
MySQLAB公司的一个高级开发者者表示,“这个特点使得MySQL可以根据你当前的系统的需要来进行调整。”触发器
触发器是数据库使用中的重用工具,它的使用很普遍,这几天写一个化学数据统计方面的软件,必要依据采样,主动盘算方差,在这里,我利用了触发器。上面我摘录了SQLServer官方教程中的一段关于触发器的笔墨,的确有效的一点笔墨形貌。__________________________________________________________________

能够界说一个不管什么时候用INSERT语句向表中拔出数据时城市实行的触发器。







当触发INSERT触发器时,新的数据行就会被拔出到触发器表和inserted表中。inserted表是一个逻辑表,它包括了已拔出的数据行的一个正本。inserted表包括了INSERT语句中已纪录的拔出举措。inserted表还同意援用由初始化INSERT语句而发生的日记数据。触发器经由过程反省inserted表来断定是不是实行触发器举措或怎样实行它。inserted表中的行老是触发器表中一行或多行的正本。







日记纪录了一切修正数据的举措(INSERT、UPDATE和DELETE语句),但在事件日记中的信息是不成读的。但是,inserted表同意你援用由INSERT语句引发的日记变更,如许就能够将拔出数据与产生的变更举行对照,来考证它们或接纳进一步的举措。也能够间接援用拔出的数据,而不用将它们存储到变量中。















示例







在本例中,将创立一个触发器。不管什么时候订购产物(不管什么时候向OrderDetails表中拔出一笔记录),这个触发器都将更新Products表中的一列(UnitsInStock)。用本来的值减往订购的数目值即为新值。







USENorthwind







CREATETRIGGEROrdDet_Insert







ON[OrderDetails]







FORINSERT







AS







UPDATEPSET







UnitsInStock=P.UnitsInStock–I.Quantity







FROMProductsASPINNERJOINInsertedASI







ONP.ProductID=I.ProductID






DELETE触发器的事情历程


当触发DELETE触发器后,从受影响的表中删除的即将被安排到一个特别的deleted表中。deleted表是一个逻辑表,它保存已被删除数据行的一个正本。deleted表还同意援用由初始化DELETE语句发生的日记数据。







利用DELETE触发器时,必要思索以下的事项和准绳:







l当某行被增加到deleted表中时,它就不再存在于数据库表中;因而,deleted表和数据库表没有不异的行。







l创立deleted表时,空间是从内存平分配的。deleted表老是被存储在高速缓存中。







l为DELETE举措界说的触发器其实不实行TRUNCATETABLE语句,缘故原由在于日记不纪录TRUNCATETABLE语句。







示例







在本例中,将创立一个触发器,不管什么时候删除一个产物种别(即从Categories表中删除一笔记录),该触发器城市更新Products表中的Discontinued列。一切受影响的产物都标志为1,标示不再利用这些产物了。







USENorthwind







CREATETRIGGERCategory_Delete







ONCategories







FORDELETE







AS







UPDATEPSETDiscontinued=1







FROMProductsASPINNERJOINdeletedASd







ONP.CategoryID=d.CategoryID














UPDATE触发器的事情历程


可将UPDATE语句当作两步操纵:即捕捉数据前像(beforeimage)的DELETE语句,和捕捉数据后像(afterimage)的INSERT语句。当在界说有触发器的表上实行UPDATE语句时,原始行(前像)被移进到deleted表,更新行(后像)被移进到inserted表。







触发器反省deleted表和inserted表和被更新的表,来断定是不是更新了多行和怎样实行触发器举措。







可使用IFUPDATE语句界说一个监督指定列的数据更新的触发器。如许,就能够让触发器简单的断绝出特定列的举动。当它检测到指定列已更新时,触发器就会进一步实行得当的举措,比方收回毛病信息指出该列不克不及更新,大概依据新的更新的列值实行一系列的举措语句。















语法







IFUPDATE(<column_name>)







例1







本例制止用户修正Employees表中的EmployeeID列。







USENorthwind







GO







CREATETRIGGEREmployee_Update







ONEmployees







FORUPDATE







AS







IFUPDATE(EmployeeID)







BEGIN







RAISERROR(Transactioncannotbeprocessed.







*****EmployeeIDnumbercannotbemodified.,10,1)







ROLLBACKTRANSACTION







END














INSTEADOF触发器的事情历程


能够在表或视图上指定INSTEADOF触发器。实行这类触发器就可以够替换原始的触动员作。INSTEADOF触发器扩大了视图更新的范例。关于每种触动员作(INSERT、UPDATE或DELETE),每个表或视图只能有一个INSTEADOF触发器。







INSTEADOF触发器被用于更新那些没有举措经由过程一般体例更新的视图。比方,一般不克不及在一个基于毗连的视图长进行DELETE操纵。但是,能够编写一个INSTEADOFDELETE触发器来完成删除。上述触发器能够会见那些假如视图是一个真实的表时已被删除的数据行。将被删除的行存储在一个名为deleted的事情表中,就像AFTER触发器一样。类似地,在UPDATEINSTEADOF触发器大概INSERTINSTEADOF触发器中,你能够会见inserted表中的新行。







不克不及在带有WITHCHECKOPTION界说的视图中创立INSTEADOF触发器。















示例







在本例中,创立了一个德国客户表和一个墨西哥客户表。安排在视图上的INSTEADOF触发器将把更新操纵从头定向到得当的基表上。这时候产生的拔出是对CustomersGer表的拔出而不是对视图的拔出。







创立两个包括客户数据的表:







SELECT*INTOCustomersGerFROMCustomersWHERECustomers.Country=

Germany







SELECT*INTOCustomersMexFROMCustomersWHERECustomers.Country=

Mexico







GO















在该数据上创立视图:







CREATEVIEW

CustomersViewAS







SELECT*FROMCustomersGer









UNION







SELECT*FROMCustomersMex







GO















创立一个在上述视图上的INSTEADOF触发器:







CREATETRIGGERCustomers_Update2







ONCustomersView







INSTEADOFUPDATEAS







DECLARE@Countrynvarchar(15)







SET@Country=(SELECTCountryFROMInserted)







IF@Country=

Germany







BEGIN







UPDATECustomersGer







SETCustomersGer.Phone=Inserted.Phone







FROMCustomersGerJOINInserted







ONCustomersGer.CustomerID=Inserted.CustomerID







END







ELSE







IF@Country=

Mexico







BEGIN







UPDATECustomersMex







SETCustomersMex.Phone=Inserted.Phone







FROMCustomersMexJOINInserted







ONCustomersMex.CustomerID=Inserted.CustomerID







END















经由过程更新视图,测试触发器:







UPDATECustomersViewSETPhone=030-007xxxxWHERECustomerID=ALFKI







SELECTCustomerID,PhoneFROMCustomersViewWHERECustomerID=ALFKI







SELECTCustomerID,PhoneFROMCustomersGerWHERECustomerID=ALFKI







--------------------------------------------那末详细的讲,关于多列数据,怎样盘算方差呢?:
CREATETRIGGER[calT1T2T3]ONdbo.DCLBFORINSERT,UPDATEASupdatePSET/**//*盘算方差的触发器*/P.T1=(I.P1+I.P2+I.P3+I.P4+I.P5+I.P6),P.T2=(I.Y1+I.Y2+I.Y3+I.Y4+I.Y5+I.Y6),P.T3=SQRT(P.T1*P.T1+P.T2*P.T2)FROMDCLBASPINNERJOINInsertedASIONP.SID=I.SID
触发器的利用很便利,并且也很复杂,主要的是了解inserted历程。可将UPDATE语句当作两步操纵:即捕捉数据前像(beforeimage)的DELETE语句,和捕捉数据后像(afterimage)的INSERT语句。当在界说有触发器的表上实行UPDATE语句时,原始行(前像)被移进到deleted表,更新行(后像)被移进到inserted表。触发器反省deleted表和inserted表和被更新的表,来断定是不是更新了多行和怎样实行触发器举措。
MySQL在业界的流行所带来的另一个好处是,人们总可以很轻松地发现本行业的MySQL学习教程。厂商都希望他们的开发工具和应用程序框架可以与MySQL数据库兼容。
作者: admin    时间: 2015-1-19 16:15
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
作者: 海妖    时间: 2015-1-24 15:46
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
作者: 再现理想    时间: 2015-2-2 06:07
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
作者: 小妖女    时间: 2015-2-7 16:59
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
作者: 冷月葬花魂    时间: 2015-2-22 18:05
大家注意一点。如下面的例子:
作者: 活着的死人    时间: 2015-3-7 01:37
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
作者: 金色的骷髅    时间: 2015-3-14 06:25
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
作者: 若天明    时间: 2015-3-21 01:02
总感觉自己还是不会SQL




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2