触发器(Trigger)

触发器(Trigger)

概念

  1)触发器是一种特殊的存储过程,主要有操作事件(INSERT,UPDATE,DELETE)触发而自动执行,不是由用户直接调用,创建触发器是会对其进行定义,以便在特定的表或列作特定类型的数据修改时执行。

 2)触发器是一种过程完整性约束,是一段程序,该程序在特定时刻被自动触发执行,比如在一次更新操作之前执行,或者更新操作之后执行。

作用

1)可以强制执行业务规则

2)可以通过数据库的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改。

3)可以实现比约束更复杂的数据完整性,经常用于加强数据的完整性约束和业务规则

4)自动化操作,减少了手动操作以及出错的几率。

分类

按照触发时间分类:

BEFORE 触发器:触发事件之前执行的触发器

AFTER触发器:

 在语句执行完毕之后进行触发

 按语句触发,而不是所影响的行数,无论影响为多少行,只触发一次

只能建立在常规表上,不能建立在视图和临时表上

可以递归触发,最高可达32级

Update(列),update语句触发时,判断某列是否被更新,返回bool 值

INSTEAD OF触发器

用来替换原本的操作

不会递归触发

可以在约束被检查之间触发

可以建在表和视图上

 

当触发事件发生以后执行触发器中指定的函数,而不是执行产生触发事件的SQL 语句,从而替代产生触发事件的SQL操作。在表或视图上,对于INSERTUPDATE 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  

不过关于触发器还是要慎用,下面是我查询到的一些帖子。

                                           

 

  今天的学习就先分享到这里,对触发器的了解只是一点皮毛,后期遇见再次会分享给大家,博客会持续更新,欢迎大家关注点评,谢谢!

评论 77
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值