如何使用SQL Server 2005 INSTEAD-OF触发器

来源:互联网 发布:淘宝上有卖电棍的吗 编辑:程序博客网 时间:2024/04/29 23:52
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

触发器是类似于存储程序的数据库对象,它响应数据库环境下的某个请求。OF.com" target=_blank>SQL Sever 2005包含3个触发器对象:AFTER,数据定义语言 (DDL)和OF.com" target=_blank>INSTEAD-OF

AFTER触发器是存储程序,它发生于数据操作语句作用之后,例如删除语句等。DDL是OF.com" target=_blank>SQL OF.com" target=_blank>Server 2005的新触发器,允许响应数据库引擎中对象定义水平事件(例如:DROP TABLE语句)。OF.com" target=_blank>INSTEAD-OF触发器是对象,在数据库引擎中可以取代数据操作语句而执行。例如:将OF.com" target=_blank>INSTEAD-OF INSERT触发器附加到表,告诉数据库执行此触发器

使用OF.com" target=_blank>INSTEAD-OF触发器的理由

OF.com" target=_blank>INSTEAD-OF触发器OF.com" target=_blank>SQL Sever功能强大的对象,允许开发人员转移数据库引擎完成不同的工作,以满足开发要求。其中的一个例子是在数据库的表中添加OF.com" target=_blank>INSTEAD-OF触发器,当不需要修改表时,可以对表的内容进行回滚。使用此方法时,必须格外小心,因为任何指定的表修改之前,OF.com" target=_blank>INSTEAD-OF触发器必须处于激活状态。

使用OF.com" target=_blank>INSTEAD-OF触发器一个更充分理由是视图处理。在视图中添加OF.com" target=_blank>INSTEAD-OF触发器后,则可创建更新的视图。可更新视图允许完整地提取数据库大纲,因此可以用此方法设计系统,而不需要担心OLTP数据库大纲的问题,并且取代数据修改一组标准视图集。

范例

为了更好地说明可更新视图概念,我们提供一个示例。在本例中,我们设计一个产品表(记录产品),一个购买表(记录购买)。"/i/developer/site/2006/9/39533795/lista.htm" target="_blank">Listing A包含了创建表的脚本,运行此脚本后则得到示例中所要用到的表。运行"/i/developer/site/2006/9/39533795/listb.htm" target="_blank">Listing B脚本向表中添加数据。

现在表中已经有数据了,我可以为这些表创建一些有意义的视图。请查看"/i/developer/site/2006/9/39533795/listc.htm" target="_blank">Listing C

这是个典型的产品水平的视图。它联合了数据库中的两个表,使得数据简单化了。但是,对于数据提取,使用视图则没有什么优势。在视图上附上OF.com" target=_blank>INSTEAD-OF触发器后,则允许修改表,但是我不需要直接修改表中的数据。我使用"/i/developer/site/2006/9/39533795/listd.htm" target="_blank">Listing D中的代码在vw_ProductPurchases视图上创建一个OF.com" target=_blank>INSTEAD-OF触发器

请注意此OF.com" target=_blank>INSTEAD OF触发器的声明。OF.com" target=_blank>SQL OF.com" target=_blank>Server创建的默认的触发器为AFTER触发器,因此,必须在触发器定义中指定OF.com" target=_blank>INSTEAD OF子句。

触发器的第一条语句是“check”语句。本例中我使用此语句检测INSERTED表以确保显示ProductID字段,并且保证提供显示其他PurchasePrice 或 ProductPrice字段。

如果必要的数据通过INSERT语句都插入到视图中,则触发器将插入指定的值到数据表。下面即是视图的INSERT语句。INSERT INTO vw_ProductPurchases(ProductID, PurchasePrice) VALUES(1, 700)

INSERT语句提供了有效的ProductID和PurchasePrice,这意味着新记录插入到Purchases表。

结论

OF.com" target=_blank>INSTEAD-OF触发器具有强大的功能和灵活性。如果系统不大,使用视图系统提取数据大纲能够极大保护数据库程序。

上面的例子很简单,系统中所用到的复杂的触发器需要考虑安全性问题、时间开销和其他限制。

Tim Chapman是一个 OF.com" target=_blank>SQL OF.com" target=_blank>Server数据库管理员,他在Louisville KY的一家银行工作,有7年的IT工作经验,通过了微软OF.com" target=_blank>SQL OF.com" target=_blank>Server 2000 OF.com" target=_blank>SQL OF.com" target=_blank>Server 2005认证。

责任编辑:"mailto:builder@zdnet.com.cn" target="_blank">张琎

"http://builder.com.com/5100-6388_14-6113179.html?part=rss&tag=feed&subj=bldr" target="_blank">查看原文国际来源<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击