深入浅出触发器

      在我的上一篇博客<深入浅出级联删除>中介绍了关于如何删除含有主外键关系的表的相关数据,使用级联删除,需要在建立表的SQL 语句中写,如果在建立表的时候没有考虑到级联删除,当使用到删除的时候在想起来,这是修改表的SQL 语句就会有点麻烦了,这时用触发器来解决这个删除有主外键关系的表的相关数据就会容易点了.那么来了解一一下出发器吧!

       中国有句话叫做"牵一发而动全身",我想触发器就是一个很好的例子,触发器就相当于早上起床的闹钟,时间到了,触发闹铃响了,听到起床的闹铃了,我该起来洗漱,开始我一天新的生活了.

       触发器(Trigger) 是个特殊的存储过程,它的执行不是由程序调用,也不是手动启动的,而是由事件来触发的,就如闹铃响了,是由于时间到了.触发器可以查询其他表,而且可以包含复杂的SQL 语句.它们主要用于强制服从复杂de业务规则和要求,也可以用于强制引用完整性,以便在多个表中添加,更新或删除行时,保留在这些表之间所定义的关系,然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束.


       在SQL Server中,SQL Server 精心的为每个触发器准备了两个专用的表:Inserted表和Deleted表.这两个表的由系统来维护的,它们存在与内存中,而不是在数据库中,.这两个表的结构总是与被触发器作用的表的结构相同,当触发器执行完成后,与该触发器相关的这两个表也被删除.

其中Deleted表存放用于执行Delete或Update语句要从表中删除的所有行.

Inserted 表存放用于执行Insert 或Update语句而要向表中插入的所有行.


       SQL Server 提供了两种触发器:Instead of 触发器和After 触发器,

       Instead of 触发器用于替代引起触发器执行的T-SQL 语句.除了表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作.

       After 触发器在一个Insert,Update 或Deleted 语句执行之后,

       一个表或视图的每一个修改动作(Insert,update 和delete)都可以与一个instead of 触发器,一个表的每一个修改动作都可以有多个afterc触发器.

       如果一个Insert,Update 或者delete 语句违反了约束,那么After 触发器不会执行,因为对约束的检查是在After触发器被激动之前发生的,所以After触发器不能超越约束.

       Instead of 触发器可以取代激发它的操作来执行,它在Inserted 表和Deleted 表刚刚建立,其他任何操作还没有发生时被执行,因为Instead of 触发器在约束之前执行,所以它可以对约束进行一些预处理.

       那么触发器的语法为:

           create trigger trigger_name
           on {table_name | view_name}
           {for | After | Instead of }
           [ insert, update,delete ]
           as
           sql_statement

       我就已删除为例,我要删除StudentInfo 表中StudentId为3的数据,如果用一条简单的Delete 语句进行删除,肯定是会提示有错误的,删除失败的,现在用触发器来写:

-- =============================================
-- Author:	唐欢
-- Create date: 2013-04-07
-- Description:	删除学生触发器
-- =============================================
CREATE TRIGGER  TrStudent
 on StudentInfo
 instead of Delete
AS 
BEGIN
declare @Cardid  int
select @Cardid =StudentID From deleted 

--删除充值信息
delete Recharge where Id in(select CardId  From Card where CardId=@Cardid )

--删除卡号
delete Card where CardId =@Cardid 

--删除学生信息
delete StudentInfo where StudentID =@Cardid 

END
GO

这是在用Delete语句删除试试:

delete StudentInfo  where StudentID ='3'

执行结果为:


这是我们就成功同时删除了具有主外键关系的主从表的相关数据了,


在建立表的时候,如果已经确定了表与表之间有主外键关系,你这是就可以考虑使用级联删除,如果在使用表的过程中,你想要删除主从表间的相关联的数据,就可以考虑使用触发器.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弯_弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值