﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-TimeLord-文章分类-SQL</title><link>http://www.cnitblog.com/libocumt/category/6247.html</link><description>有志者，事竟成，卧薪尝胆，百二秦关终属楚； 苦心人，天不负，破斧沉舟， 三千越甲可吞吴！</description><language>zh-cn</language><lastBuildDate>Wed, 05 Oct 2011 11:33:21 GMT</lastBuildDate><pubDate>Wed, 05 Oct 2011 11:33:21 GMT</pubDate><ttl>60</ttl><item><title>触发器概述</title><link>http://www.cnitblog.com/libocumt/articles/35409.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Fri, 26 Oct 2007 08:44:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/35409.html</guid><description><![CDATA[1. insert触发器的工作过程<br>&nbsp;&nbsp;&nbsp; 可以定义一个无论何时用INSERT语句向表中插入数据时都会执行的触发器。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当触发INSERT触发器时，新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表，它包含了已经插入的数据行的一个副本。inserted表包含了INSERT语句中已记录的插入<nobr><strong class=kgb onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u52A8_u4F5C";KeyGate_ads.ShowGgAds(this,"_u52A8_u4F5C",event)' style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: 0px; CURSOR: hand; COLOR: #0000ff; PADDING-TOP: 0px; BORDER-BOTTOM: 0px; TEXT-DECORATION: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BtabpGqchR9KgB5jGigSG-oVeuLGxKbTN-sUCwI23AYDxBBAEGAQghLTiBygUOABQyeCw7fj_____AWCdgdWBtAWqAQoyMDAwMDI1NDY1sgEPd3d3Lmtub3dza3kuY29tyAEB2gEiaHR0cDovL3d3dy5rbm93c2t5LmNvbS8zNDUzMjQuaHRtbIACAakCgpirp_PvgT7IAry8jwOoAwHoA58C&amp;num=4&amp;adurl=http://pneumatic.net.cn&amp;client=ca-pub-0892797939732602");GgKwClickStat("动作","www.pneumatic.net.cn","afc","2000025465");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u52A8_u4F5C"'>动作</strong></nobr>。inserted表还允许引用由初始化INSERT语句而产生的日志数据。触发器通过检查inserted表来确定是否执行触发器动作或如何执行它。inserted表中的行总是触发器表中一行或多行的副本。
<p>　　日志记录了所有修改数据的动作(INSERT、UPDATE和DELETE语句)，但在事务日志中的信息是不可读的。然而，inserted表允许你引用由INSERT语句引起的日志变化，这样就可以将插入数据与发生的变化进行比较，来验证它们或采取进一步的动作。也可以直接引用插入的数据，而不必将它们<nobr><strong class=kgb onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u5B58_u50A8";KeyGate_ads.ShowGgAds(this,"_u5B58_u50A8",event)' style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: 0px; CURSOR: hand; COLOR: #0000ff; PADDING-TOP: 0px; BORDER-BOTTOM: 0px; TEXT-DECORATION: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BfxDOGqchR9KgB5jGigSG-oVerPbHMOCrg8gHwI23AaDvDxADGAMghLTiBygUOABQ5L3dmv______AWCdgdWBtAWqAQoyMDAwMDI1NDY1sgEPd3d3Lmtub3dza3kuY29tyAEB2gEiaHR0cDovL3d3dy5rbm93c2t5LmNvbS8zNDUzMjQuaHRtbKkCgpirp_PvgT7IAozRwAGoAwHoA58C&amp;num=3&amp;adurl=http://www.wx-yh.com/p1.asp%3Fb_id%3D3&amp;client=ca-pub-0892797939732602");GgKwClickStat("存储","www.wx-yh.com/p1.asp?b_id=3","afc","2000025465");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u5B58_u50A8"'>存储</strong></nobr>到变量中。<br>示例</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在本例中，将创建一个触发器。无论何时订购<nobr><strong class=kgb onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u4EA7_u54C1";KeyGate_ads.ShowGgAds(this,"_u4EA7_u54C1",event)' style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: 0px; CURSOR: hand; COLOR: #0000ff; PADDING-TOP: 0px; BORDER-BOTTOM: 0px; TEXT-DECORATION: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BfxDOGqchR9KgB5jGigSG-oVerPbHMOCrg8gHwI23AaDvDxADGAMghLTiBygUOABQ5L3dmv______AWCdgdWBtAWqAQoyMDAwMDI1NDY1sgEPd3d3Lmtub3dza3kuY29tyAEB2gEiaHR0cDovL3d3dy5rbm93c2t5LmNvbS8zNDUzMjQuaHRtbKkCgpirp_PvgT7IAozRwAGoAwHoA58C&amp;num=3&amp;adurl=http://www.wx-yh.com/p1.asp%3Fb_id%3D3&amp;client=ca-pub-0892797939732602");GgKwClickStat("产品","www.wx-yh.com/p1.asp?b_id=3","afc","2000025465");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u4EA7_u54C1"'>产品</strong></nobr>（无论何时向Order Details表中插入一条记录），这个触发器都将更新Products表中的一列(UnitsInStock)。用原来的值减去订购的数量值即为新值。</p>
<p><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 &#8211; I.Quantity<br>FROM Products AS P INNER JOIN Inserted AS I<br>ON P.ProductID = I.ProductID </p>
<p><br>2.&nbsp; DELETE触发器的工作过程</p>
<p>　当触发DELETE触发器后，从受影响的表中删除的行将被放置到一个特殊的deleted表中。deleted表是一个逻辑表，它保留已被删除数据行的一个副本。deleted表还允许引用由初始化DELETE语句产生的日志数据。</p>
<p>　　使用DELETE触发器时，需要考虑以下的事项和原则：</p>
<p>　　&#183;当某行被添加到deleted表中时，它就不再存在于数据库表中；因此，deleted表和数据库表没有相同的行。</p>
<p>　　&#183;创建deleted表时，空间是从内存中分配的。deleted表总是被存储在高速缓存中。</p>
<p>　　&#183;为DELETE动作定义的触发器并不执行TRUNCATE TABLE语句，原因在于日志不记录TRUNCATE TABLE语句。</p>
<p>　　示例</p>
<p>　　在本例中，将创建一个触发器，无论何时删除一个产品类别（即从Categories表中删除一条记录），该触发器都会更新Products表中的Discontinued列。所有受影响的产品都<nobr><strong class=kgb onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u6807_u8BB0";KeyGate_ads.ShowGgAds(this,"_u6807_u8BB0",event)' style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: 0px; CURSOR: hand; COLOR: #0000ff; PADDING-TOP: 0px; BORDER-BOTTOM: 0px; TEXT-DECORATION: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BiHE6GqchR9KgB5jGigSG-oVekaOhCOu4vpcBwI23AYDEExABGAEghLTiBygUOABQuNTB2gdgnYHVgbQFoAHttbr-A6oBCjIwMDAwMjU0NjWyAQ93d3cua25vd3NreS5jb23IAQHaASJodHRwOi8vd3d3Lmtub3dza3kuY29tLzM0NTMyNC5odG1sgAIBqQKCmKun8--BPqgDAegDnwI&amp;num=1&amp;adurl=http://www.tonson-motor.com/c/p003.htm&amp;client=ca-pub-0892797939732602");GgKwClickStat("标记","www.neumek.com","afc","2000025465");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u6807_u8BB0"'>标记</strong></nobr>为1，标示不再使用这些产品了。</p>
<p>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 </p>
<p>3.UPDATE触发器的工作过程</p>
<p>　　可将UPDATE语句看成两步操作：即捕获数据前像(before image)的DELETE语句，和捕获数据后像(after image)的INSERT语句。当在定义有触发器的表上执行UPDATE语句时，原始行（前像）被移入到deleted表，更新行（后像）被移入到inserted表。</p>
<p>　　触发器检查deleted表和inserted表以及被更新的表，来确定是否更新了多行以及如何执行触发器动作。</p>
<!--正文内容结束--><img src ="http://www.cnitblog.com/libocumt/aggbug/35409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2007-10-26 16:44 <a href="http://www.cnitblog.com/libocumt/articles/35409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分页存储过程收集</title><link>http://www.cnitblog.com/libocumt/articles/34194.html</link><dc:creator>TimeLord</dc:creator><author>TimeLord</author><pubDate>Sat, 29 Sep 2007 13:26:00 GMT</pubDate><guid>http://www.cnitblog.com/libocumt/articles/34194.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 分页方案一：(利用Not In和SELECT TOP分页)语句形式：&nbsp;1SELECT&nbsp;TOP&nbsp;10&nbsp;*&nbsp;2FROM&nbsp;TestTable&nbsp;3WHERE&nbsp;(ID&nbsp;NOT&nbsp;IN&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.cnitblog.com/libocumt/articles/34194.html'>阅读全文</a><img src ="http://www.cnitblog.com/libocumt/aggbug/34194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/libocumt/" target="_blank">TimeLord</a> 2007-09-29 21:26 <a href="http://www.cnitblog.com/libocumt/articles/34194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>