触发器(Trigger)
概念
1)触发器是一种特殊的存储过程,主要有操作事件(INSERT,UPDATE,DELETE)触发而自动执行,不是由用户直接调用,创建触发器是会对其进行定义,以便在特定的表或列作特定类型的数据修改时执行。
2)触发器是一种过程完整性约束,是一段程序,该程序在特定时刻被自动触发执行,比如在一次更新操作之前执行,或者更新操作之后执行。
作用
1)可以强制执行业务规则
2)可以通过数据库的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改。
3)可以实现比约束更复杂的数据完整性,经常用于加强数据的完整性约束和业务规则。
4)自动化操作,减少了手动操作以及出错的几率。
分类
按照触发时间分类:
BEFORE 触发器:触发事件之前执行的触发器
AFTER触发器:
在语句执行完毕之后进行触发
按语句触发,而不是所影响的行数,无论影响为多少行,只触发一次
只能建立在常规表上,不能建立在视图和临时表上
可以递归触发,最高可达32级
Update(列),update语句触发时,判断某列是否被更新,返回bool 值
INSTEAD OF触发器:
用来替换原本的操作
不会递归触发
可以在约束被检查之间触发
可以建在表和视图上
当触发事件发生以后,执行触发器中指定的函数,而不是执行产生触发事件的SQL 语句,从而替代产生触发事件的SQL操作。在表或视图上,对于INSERT、UPDATE 或 DELETE 三种触发事件,每种最多可以定义一个INSTEAD OF 触发器。
例如我要删除某新闻类别,如果用AFTER 触发器,当删除新闻类别后,就会出现报错。请看【问题发现】
INSTEAD OF 触发器(执行触发器里面的语句)
牛腩中触发器应用
1)问题发现
你们会不会有一个疑问?假如我要删除某一个类别的新闻,(前提:该新闻类别下有新闻,和新闻评论)我是先删除评论呢?然后在删除新闻呢?最后删除类别呢?还是先删除类别,最后在删除评论呢?
2)创建触发器
Create TRIGGER [触发器名称] --建立触发器的名称
on [表名] --选择要建立触发器的表
INSTEAD OF delete --触发条件 插入/删除/更新(任选一个)
AS --伴随
BEGIN --开始执行
select * from deleted
END
3)解决问题:
大家注重看一下删除的顺序?(先删除新闻评论,在删除新闻,最后删除新闻类别)
Create TRIGGER [dbo].[tCategoryDelete] --建立触发器的名称
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
不过关于触发器还是要慎用,下面是我查询到的一些帖子。
今天的学习就先分享到这里,对触发器的了解只是一点皮毛,后期遇见再次会分享给大家,博客会持续更新,欢迎大家关注点评,谢谢!