【是什么】

        触发器(Trigger),是SQL Sever提供给程序员和数据分析员来保证数据完整性的一种方法,简单来说就是,触发器是一段由对数据库的更改事件引发的自动执行的代码,也是一种比Check约束更为复杂的高级约束。(有兴趣可以了解一下Check约束)

【作用】



         ①触发器是一种特殊的存储过程



        ②也具备事务的功能



        ③能在多表之间执行特殊的业务规则



【分类】



(一)从引发执行的事件来分



1、DML触发器



       DML触发器是由对表进行插入、删除、更改语句引发执行的代码。主要用于实现数据完整性约束和业务规则。



2、DDL触发器



       DML触发器是由数据库对象操作语句引发执行的代码,主要用于维护服务器和数据库级对象的安全性



(二)从触发器执行特点来分



1、前触发器(见实例二--牛腩)



        前触发性触发器,使用instead of选项定义的触发器为前触发器。这种模式的触发器是只执行触发器语句,而并不真正执行引发触发器执行的操作语句。



2、后触发器(见实例一--机房充值)



        后触发型触发器,使用for或after选项定义的触发器为后触发器,即只有在先执行引发触发器操作的语句,并且所有的约束检查也成功完成后,才执行触发器。



【表】



操作

Inserted表

Deleted表

Insert

存放新增的记录


Delete


存放被删除的记录

Update

存放更新后的记录

存放更新前的记录的记录



【应用实例】



1、实例一-----机房充值



-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        郑艳霞
-- Create date: 2015年7月16日15:35:50
-- Description:    充值操作触发器
-- =============================================
CREATE TRIGGER trigRecharge     --触发器名称:trigRecharge
   ON  RechargeLog                    --由RechargeLog表的操作引起
   AFTER  INSERT                        --当上表执行INSERT操作时激活该触发器
AS 
declare                      --声明变量
     @CID varchar(50),
     @Money numeric(18,2)
     select @CID=CID from inserted      --声明@CID的值来源于刚才插入的数据
     select @Money=Money from inserted 
BEGIN
    Update CardInfo set Money=@Money where CID=@CID    --将充值后的金额更新至卡表中
END
GO


2、实例二-----牛腩:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:    郑艳霞
-- Create date: 2015年8月10日18:53:22
-- Description:删除类别触发器
-- =============================================
CREATE TRIGGER trigCategoryDelete 
   ON  Category
   instead of DELETE
AS 
BEGIN
    
    declare @caId int
    select @caId=id from deleted
    --删除评论
    delete comment where newsId in (select newsId from news where caId=@caId)
    --删除新闻
    delete news where caId=@caId 
    --删除类别
    delete category where id=@caId
END
GO


【小结】


触发器中还可以加入事务,还可以对某个列的取值范围做限制,还可以提示信息等,有兴趣可以多多尝试。但是触发器还是要合理使用。首先是触发器容易被忽略,给后期维护带来一定的困难;再一个是,触发器必须要在业务和技术上有很高的要求才能不影响业务和性能。现在用的还很少还不成熟,以后多多积累,亲自探究触发器的使用好坏。