LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQL2000触发器的使用[转]

admin
2010年6月27日 17:34 本文热度 6266
触发器是数据库应用中的重用工具,它的应用很广泛。这几天写一个化学数据统计方面的软件,需要根据采样,自动计算方差,在这里,我使用了触发器。 [br][br]下面我摘录了sql server官方教程中的一段关于触发器的文字,确实有用的一点文字描述。 [br][br]可以定义一个无论何时用insert语句向表中插入数据时都会执行的触发器。 [br][br]当触发insert触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted表包含了insert语句中已记录的插入动作。inserted表还允许引用由初始化insert语句而产生的日志数据。触发器通过检查inserted表来确定是否执行触发器动作或如何执行它。inserted表中的行总是触发器表中一行或多行的副本。 [br][br]日志记录了所有修改数据的动作(insert、update和delete语句),但在事务日志中的信息是不可读的。然而,inserted表允许你引用由insert语句引起的日志变化,这样就可以将插入数据与发生的变化进行比较,来验证它们或采取进一步的动作。也可以直接引用插入的数据,而不必将它们存储到变量中。 [br][br]示例 [br][br]在本例中,将创建一个触发器。无论何时订购产品(无论何时向order details表中插入一条记录),这个触发器都将更新products表中的一列(unitsinstock)。用原来的值减去订购的数量值即为新值。 [br][br]use northwind [br]create trigger orddet_insert [br]on [order details] [br]for insert [br]as [br]update p set [br]unitsinstock = p.unitsinstock – i.quantity [br]from products as p inner join inserted as i [br]on p.productid = i.productid [br][br]delete触发器的工作过程 [br][br]当触发delete触发器后,从受影响的表中删除的行将被放置到一个特殊的deleted表中。deleted表是一个逻辑表,它保留已被删除数据行的一个副本。deleted表还允许引用由初始化delete语句产生的日志数据。 [br][br]使用delete触发器时,需要考虑以下的事项和原则: [br][br]·当某行被添加到deleted表中时,它就不再存在于数据库表中;因此,deleted表和数据库表没有相同的行。 [br][br]·创建deleted表时,空间是从内存中分配的。deleted表总是被存储在高速缓存中。 [br][br]·为delete动作定义的触发器并不执行truncate table语句,原因在于日志不记录truncate table语句。 [br][br]示例 [br][br]在本例中,将创建一个触发器,无论何时删除一个产品类别(即从categories表中删除一条记录),该触发器都会更新products表中的discontinued列。所有受影响的产品都标记为1,标示不再使用这些产品了。 [br][br]use northwind [br]create trigger category_delete [br]on categories [br]for delete [br]as [br]update p set discontinued = 1 [br]from products as p inner join deleted as d [br]on p.categoryid = d.categoryid [br][br]update触发器的工作过程 [br][br]可将update语句看成两步操作:即捕获数据前像(before image)的delete语句,和捕获数据后像(after image)的insert语句。当在定义有触发器的表上执行update语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。 [br][br]触发器检查deleted表和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。 [br][br]可以使用if update语句定义一个监视指定列的数据更新的触发器。这样,就可以让触发器容易的隔离出特定列的活动。当它检测到指定列已经更新时,触发器就会进一步执行适当的动作,例如发出错误信息指出该列不能更新,或者根据新的更新的列值执行一系列的动作语句。 [br][br]语法 [br][br]if update () [br][br]例1 [br][br]本例阻止用户修改employees表中的employeeid列。 [br][br]use northwind [br]go [br]create trigger employee_update [br]on employees [br]for update [br]as [br]if update (employeeid) [br]begin [br]raiserror ('transaction cannot be processed.\ [br]***** employee id number cannot be modified.', 10, 1) [br]rollback transaction [br]end [br][br]instead of触发器的工作过程 [br][br]可以在表或视图上指定instead of触发器。执行这种触发器就能够替代原始的触发动作。instead of触发器扩展了视图更新的类型。对于每一种触发动作(insert、update或 delete),每一个表或视图只能有一个instead of触发器。 [br][br]instead of触发器被用于更新那些没有办法通过正常方式更新的视图。例如,通常不能在一个基于连接的视图上进行delete操作。然而,可以编写一个instead of delete触发器来实现删除。上述触发器可以访问那些如果视图是一个真正的表时已经被删除的数据行。将被删除的行存储在一个名为deleted的工作表中,就像after触发器一样。相似地,在update instead of触发器或者insert instead of触发器中,你可以访问inserted表中的新行。 [br][br]不能在带有with check option定义的视图中创建instead of触发器。 [br][br]示例 [br][br]在本例中,创建了一个德国客户表和一个墨西哥客户表。放置在视图上的instead of触发器将把更新操作重新定向到适当的基表上。这时发生的插入是对customersger表的插入而不是对视图的插入。 [br][br]创建两个包含客户数据的表: [br][br]select * into customersger from customers where customers.country = 'germany' [br]select * into customersmex from customers where customers.country = 'mexico' [br][br]go [br][br]在该数据上创建视图: [br][br]create view customersview as [br]select * from customersger [br]union [br]select * from customersmex [br]go [br][br]创建一个在上述视图上的instead of触发器: [br][br]create trigger customers_update2 [br][br]on customersview [br][br]instead of update as [br][br]declare @country nvarchar(15) [br][br]set @country = (select country from inserted) [br][br]if @country = 'germany' [br][br]begin [br][br]update customersger [br][br]set customersger.phone = inserted.phone [br][br]from customersger join inserted [br][br]on customersger.customerid = inserted.customerid [br][br]end [br][br]else [br][br]if @country = 'mexico' [br][br]begin [br][br]update customersmex [br][br]set customersmex.phone = inserted.phone [br][br]from customersmex join inserted [br][br]on customersmex.customerid = inserted.customerid [br][br]end [br][br]通过更新视图,测试触发器: [br][br]update customersview set phone = ' 030-007xxxx' [br]where customerid = 'alfki' [br][br]select customerid, phone from customersview [br]where customerid = 'alfki' [br][br]select customerid, phone from customersger [br]where customerid = 'alfki' [br][br]那么具体的讲,对于多列数据,如何计算方差呢?: [br][br]create trigger [calt1t2t3] on dbo.dclb [br]for insert,update [br]as [br]update p [br]set [br]/**//* [br]计算方差的触发器 [br]*/ [br]p.t1=(i.p1+i.p2+i.p3+i.p4+i.p5+i.p6), [br]p.t2=(i.y1+i.y2+i.y3+i.y4+i.y5+i.y6 ), [br]p.t3=sqrt(p.t1*p.t1+p.t2*p.t2) [br][br]from dclb as p inner join inserted as i [br]on p.sid = i.sid [br][br]触发器的使用很方便,而且也很简单,重要的是理解inserted过程。可将update语句看成两步操作:即捕获数据前像(before image)的delete语句,和捕获数据后像(after image)的insert语句。当在定义有触发器的表上执行update语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。触发器检查deleted表和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。 [br]文章来源:[url=http://hi.baidu.com/tsredsun/blog/item/3bf2cdcaae9e6984c8176822.html]http://hi.baidu.com/tsredsun/blog/item/3bf2cdcaae9e6984c8176822.html[/url]

该文章在 2010/6/27 17:34:08 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved