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