触发器(Trigger),顾名思义,一触即发。
这里的触发指:调用某事件(如insert,delete,update)的时候执行触发器的操作,就像连锁反应一样。
作用:保证数据完整性,加强数据的完整性约束和业务规则。说白了也就是保持数据一致性,不能同一字段在不同的数据表里面数据不一致。
度娘如是说:在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。
解读:约束此处应该指的是数据库完整性约束。约束,触发器,索引等都是为了保证数据的正确性和一致性而存在的。
常见约束:唯一性(Unique)和主键约束(Primary key)、外键约束(Foreign key)、检查约束(Check)、空值约束(NOT Null)、默认值约束(Defult)。
比如之前我们做过的《机房收费系统》,进行充值后,不仅仅要插入充值记录到充值表里面,还要更新学生的卡余额,通过上面的这些约束,无法做到同时更新两个表的数据,这就可以用到触发器。这样可以避免数据更新不同步造成的数据错误,不一致现象。
物极必反,凡事存在两面性。滥用触发器同样会给我们带来麻烦。比如影响数据库的结构,增加维护的复杂程度。
学过《数据库系统原理》的同学都应该对主外键关系有所了解。如果一条SQL语句存在外键,想要删除该语句,就必须要先删除外键关联的表中对应的语句。比如牛腩里面的类别表(category)里面包含新闻表(news)的外键,新闻表(news)又包含评论表(comment)的外键,要想删除的时候要先根据新闻类别,找到该类别下的新闻,再找到新闻下的评论,先删除评论,然后是新闻,再是新闻类别,才能进行删除。
代码实例:
<span style="font-family:SimSun;"><span style="font-family:Microsoft YaHei;"><span style="font-family:SimSun;font-size:18px;">USE [newssystem] GO /****** Object: Trigger [dbo].[trigCategoryDelete] Script Date: 02/02/2015 23:22:09 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 王美 -- Create date: 2015年2月2日 -- Description:删除类别触发器 -- ============================================= ALTER TRIGGER [dbo].[trigCategoryDelete] ON [dbo].[category] instead of DELETE AS BEGIN declare @caId int--定义id select @caId=id from deleted --从删除的里面取出id --删除评论 delete comment where newsId in(select newsId from news where caId=@caid ) --删除新闻 delete news where caId =@caId --先删除类别下面的所有新闻 --删除类别 delete category where id =@caId --删除该类别 END </span></span></span>
机遇之于人就像触发器的事件,前提是要时刻完善自身的触发器,这样才不会与机遇失之交臂。
原文地址:http://blog.csdn.net/wangmei4968/article/details/43423703