大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 数据库 -> MS_SQL -> SQL Server 2000中的触发器使用

SQL Server 2000中的触发器使用

时间: 2021-08-13 作者:daque

触发器是数据库运用中的重用功具,它的运用很普遍。这几天写一个化学数据统计上面的软硬件,须要按照采集样品,机动计划方差,在这边,我运用了触发器。    底下我节录了sql server官方教程中的一段对于触发器的笔墨,真实有效的一点笔墨刻画。     不妨设置一个不管何时用insert语句向表中插入数据时城市实行的触发器。    当触发insert触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个论理表,它包括了仍旧插入的数据行的一个复本。inserted表包括了insert语句中已记载的插入举措。inserted表还承诺援用由初始化insert语句而爆发的日记数据。触发器经过查看inserted表来决定能否实行触发器举措或怎样实行它。inserted表中的行老是触发器表中一条龙或多行的复本。    日记记载了一切窜改数据的举措(insert、update和delete语句),但在工作日记中的消息是不行读的。但是,inserted表承诺你援用由insert语句惹起的日记变革,如许就不妨将插入数据与爆发的变革举行比拟,来考证它们或采用进一步的举措。也不妨径直援用插入的数据,而不用将它们保存到变量中。    示例    在本例中,将创造一个触发器。不管何时定购产物(不管何时向order details表中插入一条记载),这个触发器都将革新products表中的一列(unitsinstock)。用从来的值减去定购的数目值即为新值。 use northwind create trigger orddet_insert on [order details] for insert as update p set unitsinstock = p.unitsinstock – i.quantity from products as p inner join inserted as i on p.productid = i.productid    delete触发器的处事进程    当触发delete触发器后,从受感化的表中简略的即将被安置到一个特出的deleted表中。deleted表是一个论理表,它保持已被简略数据行的一个复本。deleted表还承诺援用由初始化delete语句爆发的日记数据。    运用delete触发器时,须要商量以次的事变和规则:    ·当某行被增添到deleted表中时,它就不复生存于数据库表中;所以,deleted表和数据库表没有沟通的行。    ·创造deleted表时,空间是从外存中调配的。deleted表老是被保存在高速缓存中。    ·为delete举措设置的触发器并不实行truncate table语句,因为在乎日记不记载truncate table语句。    示例    在本例中,将创造一个触发器,不管何时简略一个产物类型(即从categories表中简略一条记载),该触发器城市革新products表中的discontinued列。一切受感化的产物都标志为1,标示不复运用那些产物了。 use northwind create trigger category_delete on categories for delete as update p set discontinued = 1 from products as p inner join deleted as d on p.categoryid = d.categoryid    update触发器的处事进程    可将update语句看成两步操纵:即捕捉数据前像(before image)的delete语句,和捕捉数据后像(after image)的insert语句。当在设置有触发器的表上实行update语句时,原始行(前像)被移入到deleted表,革新行(后像)被移入到inserted表。    触发器查看deleted表和inserted表以及被革新的表,来决定能否革新了多行以及怎样实行触发器举措。    不妨运用if update语句设置一个监督指定列的数据革新的触发器。如许,就不妨让触发器简单的分隔出一定列的震动。当它检验和测定到指定列仍旧革新时,触发器就会进一步实行符合的举措,比方发堕落误消息指出该列不许革新,大概按照新的革新的列值实行一系列的举措语句。    语法 if update (<column_name>)    例1    本例遏止用户窜改employees表中的employeeid列。 use northwind go create trigger employee_update on employees for update as if update (employeeid) begin  raiserror (’transaction cannot be processed.\ ***** employee id number cannot be modified.’, 10, 1) rollback transaction end     instead of触发器的处事进程    不妨在表或视图上指定instead of触发器。实行这种触发器就不妨代替原始的触发举措。instead of触发器扩充了视图革新的典型。对于每一种触发举措(insert、update或 delete),每一个表或视图只能有一个instead of触发器。    instead of触发器被用来革新那些没有方法经过平常办法革新的视图。比方,常常不许在一个鉴于贯穿的视图长进行delete操纵。但是,不妨编写一个instead of delete触发器来实行简略。上述触发器不妨考察那些即使视图是一个真实的表时仍旧被简略的数据行。将被简略的行保存在一个名为deleted的处事表中,就像after触发器一律。一致地,在update instead of触发器大概insert instead of触发器中,你不妨考察inserted表中的新行。    不许在带有with check option设置的视图中创造instead of触发器。[page_break]示例    在本例中,创造了一个德国存户表和一个墨西哥存户表。安置在视图上的instead of触发器将把革新操纵从新定向到符合的基表上。这时候爆发的插入是对customersger表的插入而不是目视图的插入。    创造两个包括存户数据的表: select * into customersger from customers where customers.country = ’germany’ select * into customersmex from customers where customers.country = ’mexico’ go    在该数据上创造视图: create view customersview as select * from customersger union select * from customersmex go    创造一个在上述视图上的instead of触发器: create trigger customers_update2 on customersview instead of update as declare @country nvarchar(15) set @country = (select country from inserted) if @country = ’germany’ begin update customersger set customersger.phone = inserted.phone from customersger join inserted on customersger.customerid = inserted.customerid end else if @country = ’mexico’ begin update customersmex set customersmex.phone = inserted.phone from customersmex join inserted on customersmex.customerid = inserted.customerid end    经过革新视图,尝试触发器: update customersview set phone = ’ 030-007xxxx’  where customerid = ’alfki’ select customerid, phone from customersview  where customerid = ’alfki’ select customerid, phone from customersger  where customerid = ’alfki’    那么简直的讲,对于多列数据,怎样计划方差呢?: create trigger [calt1t2t3] on dbo.dclb  for insert,update as update p set /**//* 计划方差的触发器 */ 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) from dclb as p inner join inserted as i on p.sid = i.sid    触发器的运用很简单,并且也很大略,要害的是领会inserted进程。可将update语句看成两步操纵:即捕捉数据前像(before image)的delete语句,和捕捉数据后像(after image)的insert语句。当在设置有触发器的表上实行update语句时,原始行(前像)被移入到deleted表,革新行(后像)被移入到inserted表。触发器查看deleted表和inserted表以及被革新的表,来决定能否革新了多行以及怎样实行触发器举措。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.