在做机房重构的时候接触过触发器,当初就是为了用,刚开始是模仿然后是根据自己的理解实践。这几天再次学习了触发器,收获很多。接下来就我自己学到的做一个简单的总结。
首先,触发器是一种特殊的存储过程,可以封装多个SQL语句,同时又与存储过程存在着区别:
触发器有两个特殊的只读性虚拟表:插入表(Inserted表)和删除表(Deleted表),这两张表由系统自动生成,当触发器完成需求后仍由系统自动删除,分别用来存储修改后或插入的新数据和更新前的或删除的旧数据。具体如下图:
其中,触发器DML分为两大类:前触发和后触发。
前触发:跳过执行触发事件(insert、update、delete)的自身代码,直接执行触发器
后触发:先执行触发事件的代码之后再执行触发器。
此处以一个删除触发器来做一个示例:
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
很多知识是要通过动手实践去体会和理解的,我们要勇于不断地去尝试去探索,在学习的过程中不要害怕出错,遇到问题解决问题,你会发现在解决的路途中也会有不一样的风景。至于触发器的好处,我觉得这要根据自己的应用去慢慢切身体会。