再识触发器

在做机房重构的时候接触过触发器,当初就是为了用,刚开始是模仿然后是根据自己的理解实践。这几天再次学习了触发器,收获很多。接下来就我自己学到的做一个简单的总结。


首先,触发器是一种特殊的存储过程,可以封装多个SQL语句,同时又与存储过程存在着区别:


再识触发器_第1张图片


触发器有两个特殊的只读性虚拟表:插入表(Inserted表)和删除表(Deleted表),这两张表由系统自动生成,当触发器完成需求后仍由系统自动删除,分别用来存储修改后或插入的新数据和更新前的或删除的旧数据。具体如下图:


再识触发器_第2张图片


其中,触发器DML分为两大类:前触发和后触发。

前触发:跳过执行触发事件(insert、update、delete)的自身代码,直接执行触发器

后触发:先执行触发事件的代码之后再执行触发器。


再识触发器_第3张图片


此处以一个删除触发器来做一个示例:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		王英群
-- Create date: 2014-6-26 11:36:04
-- Description:	删除新闻类别触发器(删除类别,同时删除该类别下的新闻和评论)
-- =============================================
--先判断该触发器是否存在,如果存在则删除重新创建

if (object_id('trigCategotyDelete', 'TR') is not null)  --object_id()为数据库内置函数,判断触发器是否存在 
    drop trigger trigCategotyDelete   --该句执行删除触发器操作
    
 go
 
CREATE TRIGGER trigCategotyDelete      --该句执行创建触发器操作
On Category                            --执行触发器的操作表
instead of delete                      --定义的触发事件
AS 
BEGIN
	declare @caId int                  --声明变量
	
	select @caId =id  from deleted 
	--删除评论
	delete comment where newsId =(select newsId from news where caId=@caId)
	--删除新闻
	delete news where caId =@caId 
	--删除类别
	delete category where id=@caId 
END
GO

更多详细的关于触发器的实例,请参考http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html


很多知识是要通过动手实践去体会和理解的,我们要勇于不断地去尝试去探索,在学习的过程中不要害怕出错,遇到问题解决问题,你会发现在解决的路途中也会有不一样的风景。至于触发器的好处,我觉得这要根据自己的应用去慢慢切身体会。




你可能感兴趣的:(再识触发器)