触发器是基于一个表创建的,但是可以针对多个表进行操作。所以触发器可以用来对表实施复杂的完整性的约束,当触发器所保存的数据发生改变时,触发器所保存的数据发生改变时,触发器被自动激活,从而防止对数据的不正确修改。
下面对每个INSERT、DELETE、UPDATE触发器举一个小例子来加深理解:
INSERT触发器:
INSERT触发器就是当对定义触发器的表执行INSERT语句时,就会调用的触发器,INSERT触发器可以用来修改,甚至拒绝接受正插入的记录。
建立一个学生信息管理的数据库,并且建立两个表,如下图所示:
ClassInfo表如下:
StudentInfo表如下:
新建查询,输入如下的代码:
- create trigger T_addStudent
-
on StudentInfo
-
for insert
-
as
-
update ClassInfo set totalNum=totalNum+1
-
where ClassNo = (select StuClass from inserted)
create trigger T_addStudent
on StudentInfo
for insert
as
update ClassInfo set totalNum=totalNum+1
where ClassNo = (select StuClass from inserted)
上面这段代码就是建立了一个插入触发器
如上图所示
1、 写明触发器的名称
2、 该触发器是在那个表改变的时候发生
3、 当这个表进行什么操作的时候发生
4、 发生上述操作之后还要进行怎样的操作。
这段代码的意思是:当在studentInfo表中添加一条记录的时候,就要更新ClassInfo中的TotalNum这一列,这一列的数据要增加1
下面我们验证一下:
输入下面的代码:
- select totalNum from ClassInfo where ClassNo ='002'
-
insert into StudentInfo values('小明','003','002','男')
-
select totalNum from ClassInfo where ClassNo ='002'
select totalNum from ClassInfo where ClassNo ='002'
insert into StudentInfo values('小明','003','002','男')
select totalNum from ClassInfo where ClassNo ='002'
执行之后将出现下面的结果:
所以当我们想student表中插入一条记录的时候,Class表中的某一列就会加1.
DELETE触发器:
当数据库运行DELETE语句时,就会激活DELETE触发器,DELETE触发器用于约束用户能够从数据库中删除的数据,因为这些数据中,有些数据是不希望用户轻易删除的。
接下来,我们再建立一个表,并且输入一些数据,如下图所示:
</pre><p></p><img alt="" src="http://hi.csdn.net/attachment/201202/28/0_13304299238UZ3.gif" /> <p></p><p>新建查询,输入如下的代码:</p><span style="font-family:monospace;BACKGROUND-COLOR: rgb(240,240,240); WHITE-SPACE: pre">create Trigger T_DELETETEACHERon TeacherInfoFor deleteas select TeacherName as 教师姓名,Sex, Age from deleted</span> <div><span style="font-family:monospace;BACKGROUND-COLOR: rgb(240,240,240); WHITE-SPACE: pre"></span><p>输入下面的语句</p><p>delete from TeacherInfo where TeacherId = '001'</p></div><div><span style="font-family:monospace;BACKGROUND-COLOR: rgb(240,240,240); WHITE-SPACE: pre"></span><p>执行结果如图所示:</p></div><div><span style="font-family:monospace;BACKGROUND-COLOR: rgb(240,240,240); WHITE-SPACE: pre"><img alt="" src="http://hi.csdn.net/attachment/201202/28/0_1330430024b33h.gif" /> </span></div><div><span style="font-family:monospace;BACKGROUND-COLOR: rgb(240,240,240); WHITE-SPACE: pre"></span><p>他会将我们刚刚删除的语句显示出来。</p><p>UPDATE 触发器:</p><p>当一个UPDATE语句在目标表上运行的时候,就会调用UPDATE触发器,这种类型的触发器专门用于约束用户能修改的现有的数据。</p><p>继续用上面的教师信息表,输入下面的代码</p></div><div><span style="font-family:monospace;BACKGROUND-COLOR: rgb(240,240,240); WHITE-SPACE: pre"></span><div class="dp-highlighter bg_sql"><div class="bar"><div class="tools"><strong>[sql]</strong> <a target=_blank class="ViewSource" title="view plain" href="http://blog.csdn.net/wangboxian/article/details/7303474#">view plain</a><a target=_blank class="CopyToClipboard" title="copy" href="http://blog.csdn.net/wangboxian/article/details/7303474#">copy</a><a target=_blank class="PrintSource" title="print" href="http://blog.csdn.net/wangboxian/article/details/7303474#">print</a><a target=_blank class="About" title="?" href="http://blog.csdn.net/wangboxian/article/details/7303474#">?</a></div></div><ol class="dp-sql"><li class="alt"><span><span class="keyword">create</span><span> </span><span class="keyword">trigger</span><span> t_Update </span></span></li><li><span></span><span class="keyword">on</span><span> TeacherInfo </span></li><li class="alt"><span></span><span class="keyword">for</span><span> </span><span class="keyword">update</span><span> </span></li><li><span></span><span class="keyword">as</span><span> </span></li><li class="alt"><span>if (</span><span class="keyword">update</span><span>(TeacherName)</span><span class="op">or</span><span> </span><span class="keyword">update</span><span>(sex)) </span></li><li><span></span><span class="keyword">begin</span><span> </span></li><li class="alt"><span> print</span><span class="string">'事物不能被处理,基本数据不能修改!'</span><span> </span></li><li><span> </span><span class="keyword">rollback</span><span> </span><span class="keyword">transaction</span><span> </span></li><li class="alt"><span></span><span class="keyword">end</span><span> </span></li><li><span></span><span class="keyword">else</span><span> </span></li><li class="alt"><span> print</span><span class="string">'数据修改成功!'</span><span> </span></li></ol></div><pre style="DISPLAY: none" class="sql" name="code">create trigger t_Update
on TeacherInfo
for update
as
if (update(TeacherName)or update(sex))
begin
print'事物不能被处理,基本数据不能修改!'
rollback transaction
end
else
print'数据修改成功!'
接着我们更改一下第二条教师的信息
输入下面的代码:
Update TeacherInfo setTeacherName=’仙儿’ where TeacherID = ‘002’
将弹出下面的消息框: