在耿建玲视频中就学习了触发器这个知识点,但是当时没有认真的学习者块知识,只知道触发器是当我们对数据库中的表进行操作的时候,自动触发执行sql语句,但是到底是怎么使用?以及基本语法是什么都不是很清楚,所以在第一遍机房的时候也没有用触发器,因为当时发扬了“重复就是力量”的精神,都是一遍一遍的写重复的代码。可是在重构的时候比较懒,不愿意写那些重复的代码,所以就对这个只是小研究了一下,下面和大家分享一下:
基本概念:
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发当我们对表进行 增(Add)、删(Delete)、改(Update)操作时,自动执行我们预先写好的sql语句(可以包含复杂的sql语句)。
分类:
1、DML触发器
当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。
2、DDL触发器
它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。
3、登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
第一类触发器是我们经常用到的一类,下面我就结合机房收费系统给大家介绍一下触发器的基本语法和用法。
当我们充值和退卡的时候,我们不单要增加充值表和退卡表中的记录,同时我们需要更新学生表中的余额,这样我们就可以用触发器轻松实现,代码如下:
-- =============================================
-- Author: 郑浩
-- Create date: 2014-12-26
-- Description: 当充值的时候更新学生表中的余额
-- =============================================
ALTER TRIGGER [dbo].[Recharge] ’ 触发器名称
ON [dbo].[ZH_RechargeInfo] ’作用于那个表
AFTER INSERT '执行 插入操作
AS
BEGIN
--引发操作:向注册表和充值表中插入数据
update ZH_StudentInfo set Cash=cash+(select RechargeCash from inserted) where CardNo=(select CardNo from inserted)
END
大家可能注意到在代码中有这样一个"inserted"东西,这个一个虚拟表来存放我们刚插入的数据,这样我们就可以从这个虚拟表中获取刚插入的数据。Update型触发器和Insert非常相似,在这就不在列举实例。
下面来看一下delete型的触发器,当值班教师下班的时候,我们需要从正在值班教师表中删除这条数据,同时在值班记录表中插入数据,下面来看一下代码:
ALTER TRIGGER [dbo].[Trigger_OnWorkLog]
ON [dbo].[ZH_OnWorkInfo]
AFTER delete ’当执行delete操作时激活触发器
AS
declare @LoginDate date, ’声明变量
@LoginTime varchar(50),
@LogoutDate date,
@LogoutTime varchar(50),
@Status varchar(50),
@WorkComputer varchar(50),
@UserID varchar(50)
select @UserID=UserID FROM deleted
select @LoginDate =LoginDate from deleted
select @LoginTime = LoginTime from deleted
select @WorkComputer=WorkComputer from deleted
set @LogoutDate =CONVERT (varchar (10),GETDATE (),120) --获取日期
set @LogoutTime =CONVERT (varchar (10),GETDATE (),108) --获取时间
set @Status = '未值班'
BEGIN
-- 引发操作
insert into ZH_WorkLogInfo(UserID,LoginDate,LoginTime,LogoutDate,LogoutTime,Status,WorkComputer) values(@UserID,@LoginDate,@LoginTime,@LogoutDate,@LogoutTime,@Status,@WorkComputer)
END
大家可以看到在上面的代码中有这样一个“deleted”单词,这也是一个虚拟表用来存放我们刚刚删除的数据,它的机制是这样的,当我们执行删除操作的时候,它会将要删除的数据存放在这张虚拟表中,当触发器执行完成后,在将数据从虚拟表中彻底删除。
优点:
我们都知道数据库中的约束只能是对于一张表中的数据进行约束,而触发器可以执行复杂的sql语句实现级联修改,并且可以强制用比CHECK约束定义的约束更为复杂的约束,这样更是对表的操作更加简单和灵活。
小结
在我们重构的时候应该有一种新的思路,尽可能的用不同的方法来实现要求,不能在延续第一遍机房的思想,如果那样我们的重构就没有意思了,应该加入一些新鲜血液,让我们在前面学的更多的理论知识用于到实践中。
在下一篇博客将结合机房来浅析一下存储过程。