<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fatkun&#039;s blog &#187; 触发器</title>
	<atom:link href="http://fatkun.com/tag/%e8%a7%a6%e5%8f%91%e5%99%a8/feed" rel="self" type="application/rss+xml" />
	<link>http://fatkun.com</link>
	<description>又一个 WordPress 站点</description>
	<lastBuildDate>Sat, 19 May 2012 17:25:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>MSSQL触发器基础（在触发器遍历所有数据）</title>
		<link>http://fatkun.com/2009/11/mssql%e8%a7%a6%e5%8f%91%e5%99%a8%e5%9f%ba%e7%a1%80%ef%bc%88%e5%9c%a8%e8%a7%a6%e5%8f%91%e5%99%a8%e9%81%8d%e5%8e%86%e6%89%80%e6%9c%89%e6%95%b0%e6%8d%ae%ef%bc%89.html</link>
		<comments>http://fatkun.com/2009/11/mssql%e8%a7%a6%e5%8f%91%e5%99%a8%e5%9f%ba%e7%a1%80%ef%bc%88%e5%9c%a8%e8%a7%a6%e5%8f%91%e5%99%a8%e9%81%8d%e5%8e%86%e6%89%80%e6%9c%89%e6%95%b0%e6%8d%ae%ef%bc%89.html#comments</comments>
		<pubDate>Mon, 23 Nov 2009 21:14:07 +0000</pubDate>
		<dc:creator>fatkun</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[CURSOR]]></category>
		<category><![CDATA[TRIGGER]]></category>
		<category><![CDATA[触发器]]></category>
		<category><![CDATA[遍历数据表]]></category>

		<guid isPermaLink="false">http://fatkun.com/?p=54</guid>
		<description><![CDATA[最近很懒，也有忙的原因~~一些东西懒得发上来了·~~还是要写上来才可以，不然学到的东西以后我就忘记了 以下只保证在MSSQL下顺利执行~~可能在MySql不太一样。 最近在做作业的时候想用用数据库的触发器写写~发觉还不是一般的烦呀~~变量多了就觉得有点烦了~~不过语言还是挺容易上手的~~ 插播一句：ID自增的写法 CREATE TABLE ritem&#40; id INT IDENTITY&#40;1,1&#41; &#41;; 触发器的基本写法 CREATE TRIGGER 触发器名 ON 数据表名 FOR &#40;INSERT&#124;update&#124;delete&#41; AS BEGIN 在这里写代码 END 定义变量，并赋值 CREATE TRIGGER t_insert_ritem ON ritem FOR INSERT AS BEGIN DECLARE @id INT SELECT @id=id FROM inserted -- 从插入的数据获得ID的值，还有一个deleted -- inserted表示新的数据，deleted表示旧的数据（自己理解的，不知道对不对？） &#160; SET @id = @id - 1 -- 另一种赋值 &#160; PRINT [...]]]></description>
			<content:encoded><![CDATA[<p>最近很懒，也有忙的原因~~一些东西懒得发上来了·~~还是要写上来才可以，不然学到的东西以后我就忘记了<br />
以下只保证在MSSQL下顺利执行~~可能在MySql不太一样。<br />
最近在做作业的时候想用用数据库的触发器写写~发觉还不是一般的烦呀~~变量多了就觉得有点烦了~~不过语言还是挺容易上手的~~<br />
插播一句：ID自增的写法</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> ritem<span style="color: #66cc66;">&#40;</span>
	id <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">IDENTITY</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>触发器的基本写法</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> 触发器名 <span style="color: #993333; font-weight: bold;">ON</span> 数据表名 <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">INSERT</span><span style="color: #66cc66;">|</span>update<span style="color: #66cc66;">|</span>delete<span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">AS</span> 
<span style="color: #993333; font-weight: bold;">BEGIN</span>
	在这里写代码
<span style="color: #993333; font-weight: bold;">END</span></pre></div></div>

<p>定义变量，并赋值</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> t_insert_ritem <span style="color: #993333; font-weight: bold;">ON</span> ritem <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">INSERT</span>
<span style="color: #993333; font-weight: bold;">AS</span> 
<span style="color: #993333; font-weight: bold;">BEGIN</span>
	<span style="color: #993333; font-weight: bold;">DECLARE</span> @id <span style="color: #993333; font-weight: bold;">INT</span>
	<span style="color: #993333; font-weight: bold;">SELECT</span> @id<span style="color: #66cc66;">=</span>id <span style="color: #993333; font-weight: bold;">FROM</span> inserted
	<span style="color: #808080; font-style: italic;">-- 从插入的数据获得ID的值，还有一个deleted</span>
	<span style="color: #808080; font-style: italic;">-- inserted表示新的数据，deleted表示旧的数据（自己理解的，不知道对不对？）</span>
&nbsp;
	<span style="color: #993333; font-weight: bold;">SET</span> @id <span style="color: #66cc66;">=</span> @id <span style="color: #66cc66;">-</span> <span style="color: #cc66cc;">1</span>
	<span style="color: #808080; font-style: italic;">-- 另一种赋值</span>
&nbsp;
	PRINT @id
	<span style="color: #808080; font-style: italic;">-- 可以把值打印出来，在查询分析器结果可以看到</span>
	raiserror<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'抛出错误 id的值为：%d'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">16</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span>@id<span style="color: #66cc66;">&#41;</span> 
	<span style="color: #808080; font-style: italic;">-- 也可以这样输出</span>
&nbsp;
	<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #66cc66;">&#40;</span>@id&amp;lt;<span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">BEGIN</span>
		<span style="color: #993333; font-weight: bold;">ROLLBACK</span> <span style="color: #993333; font-weight: bold;">TRANSACTION</span>
		<span style="color: #808080; font-style: italic;">-- 回滚事务</span>
	<span style="color: #993333; font-weight: bold;">END</span>
&nbsp;
	<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> ritem <span style="color: #993333; font-weight: bold;">WHERE</span> id<span style="color: #66cc66;">=</span>@id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">BEGIN</span>
		<span style="color: #808080; font-style: italic;">-- 还可以用exists来判断是否为空</span>
	<span style="color: #993333; font-weight: bold;">END</span>
<span style="color: #993333; font-weight: bold;">END</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> TRIGGER_Update <span style="color: #993333; font-weight: bold;">ON</span> ritem
<span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">UPDATE</span>
<span style="color: #993333; font-weight: bold;">AS</span>
    <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">UPDATE</span><span style="color: #66cc66;">&#40;</span>UserName<span style="color: #66cc66;">&#41;</span>
    <span style="color: #993333; font-weight: bold;">BEGIN</span>
	<span style="color: #808080; font-style: italic;">-- 判断UserName有没有更新</span>
    <span style="color: #993333; font-weight: bold;">END</span></pre></div></div>

<blockquote><div class="quote">
　　1.插入操作(Insert)<br />
　　Inserted表有数据，Deleted表无数据<br />
　　2.删除操作(Delete)<br />
　　Inserted表无数据，Deleted表有数据<br />
　　3.更新操作(Update)<br />
　　Inserted表有数据(新数据)，Deleted表有数据(旧数据)
</div>
</blockquote>
<p>当你更新一个数据想要把相关联的所有数据都更新的时候就要用游标(CURSOR)鸟~~MSSQL的遍历</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;">	<span style="color: #993333; font-weight: bold;">DECLARE</span> @id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">,</span> @rid <span style="color: #993333; font-weight: bold;">INT</span>
	<span style="color: #993333; font-weight: bold;">DECLARE</span> cur_tmp CURSOR <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span>rid <span style="color: #993333; font-weight: bold;">FROM</span> ritem
	<span style="color: #993333; font-weight: bold;">OPEN</span> cur_tmp
	FETCH <span style="color: #993333; font-weight: bold;">NEXT</span> <span style="color: #993333; font-weight: bold;">FROM</span> cur_tmp <span style="color: #993333; font-weight: bold;">INTO</span> @id<span style="color: #66cc66;">,</span>@rid <span style="color: #808080; font-style: italic;">-- 这里是取到select的值</span>
	WHILE @@FETCH_STATUS <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>
	<span style="color: #993333; font-weight: bold;">BEGIN</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">-- 在这中间加入循环</span>
&nbsp;
	FETCH <span style="color: #993333; font-weight: bold;">NEXT</span> <span style="color: #993333; font-weight: bold;">FROM</span> cur_tmp <span style="color: #993333; font-weight: bold;">INTO</span> @id<span style="color: #66cc66;">,</span>@rid
	<span style="color: #993333; font-weight: bold;">END</span>
	CLOSE cur_tmp
	DEALLOCATE cur_tmp <span style="color: #808080; font-style: italic;">-- 释放游标</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://fatkun.com/2009/11/mssql%e8%a7%a6%e5%8f%91%e5%99%a8%e5%9f%ba%e7%a1%80%ef%bc%88%e5%9c%a8%e8%a7%a6%e5%8f%91%e5%99%a8%e9%81%8d%e5%8e%86%e6%89%80%e6%9c%89%e6%95%b0%e6%8d%ae%ef%bc%89.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

