一、触发器
1.1定义
触发器是特殊的存储过程,主要通过事件进行触发而被执行。
1.2特点
2.触发器可以对数据库中的相关表进行级联更改
3.触发器可以实现被Check约束更复杂的数据完整性约束。
1.3创建
1.使用企业管理器创建触发器
2.使用T-SQL语句创建触发器
1.4实例
机房收费系统里边。如果注册学生,向学生信息注册表里边添加学生信息(注册的时候,就会在卡里充一部分钱),如果是固定用户,需要在充值表里添加一条充值记录。如果是临时用户,就不需要再充值表里添加记录。
使用企业管理器创建的触发器:
-- =============================================
-- Author: <>
-- Create date: <2013年12月4日>
-- Description: <Stu_info表添加学生信息时。如果是固定用户,则Stu_Regcharge表添加充值信息,如果是临时用户,则不添加充值信息>
-- =============================================
ALTER TRIGGER [dbo].[RegisterStudent] /* 定义触发器的名称*/
ON [dbo].[Stu_Info] /*操作表为学生信息注册表*/
AFTER Insert /*触发事件为插入*/
AS
DECLARE @stuCardNO char(20), /*定义插入充值表的参数*/
@stuType char(20),
@stuAmount char(20),
@stuRechargeDate char(20),
@stuRechargeTime char(20),
@stuRechargeUser char(20)
SELECT @stuCardNO = CardNO,@stuType = stuType,@stuAmount=CurrentBalance,@stuRechargeDate=RegisterDate,@stuRechargeTime = RegisterTime,@stuRechargeUser =RegisterUser FROM INSERTED /*将插入的记录,选出插入充值表需要的值赋值给参数*/
IF(@stuType='固定') /*如果是固定用户,将注册时充值的金额,写入充值表中*/
BEGIN
INSERT INTO stu_Recharge (CardNO,RechargeAmount,RechargeDate,RechargeTime,RechargeUser,IsCheckOut) values (@stuCardNO,@stuAmount,@stuRechargeDate,@stuRechargeTime,@stuRechargeUser,'未结账')
END
IF(@stuType='临时')
BEGIN
ROLLBACK TRANSACTION
END
主要是想如果是‘临时’用户,就不会添加充值记录。结果,学生信息也不能写入学生信息注册表了。再一看条件判断,如果是‘临时’的,学生信息注册表插入这个事件中途回滚,造成学生信息不能注册。只要将它删除就可以。
学习触发器、存储过程之前,问了学过的同学,对存储过程、触发器有了大致的了解。后来查些资料、看他们的博客,尝试做。贾林师傅、温欢、汤长海师哥,在他们给我讲的时候,我发现一个共性的东西:我以前听过存储过程、触发器,现在学习它,遇到问题了,卡了就解决这个问题,但是三个师哥,这个问题在师哥手里处理的时候,他们都会提到需求、用户。把我学习的问题,都当作了实战,佩服。
1.5注意
1.表进行更新,触发器开始执行里边定义的内容。所以触发器比较灵活,不好控制。
2.对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。
1.6比较触发器、存储过程
1.存储过程与触发器是SQL Server中的两类数据库对象。它们都是由T-SQL语句编写而成的过程
2.存储过程是由用户根据需要调用执行的,而触发器则是由某个动作(如删除或修改一条记录)引发执行的。
3.存储过程可以不依附于表而单独存在,而触发器则必须依附于一个特定的表