SQL Server数据库中使用触发器经验(2)

2008-04-02 11:01:39来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

能够在表或视图上指定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触发器。

示例

在本例中,创建了一个德国客户表和一个墨西哥客户表。放置在视图上的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表连同被更新的表,来确定是否更新了多行连同如何执行触发器动作。


标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: SQL Server数据库中空值处理技巧

下一篇: SQL Server 2005联机重新生成索引

IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设

网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源

网站联盟: 联盟新闻 联盟介绍 联盟点评 网赚技巧

行业资讯: 搜索引擎 网络游戏 电子商务 广告传媒

网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它

服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护

软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷

网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash

程序设计: Java技术 C/C++ VB delphi

网络知识: 网络协议 网络安全 网络管理 组网方案 Cisco技术

操作系统: Win2000 WinXP Win2003 Mac OS Linux FreeBSD

热门词条
最新资讯
热门关注
热门标签