首页 > 代码库 > 机房重构(4)——触发器的使用

机房重构(4)——触发器的使用

      上篇文章《机房重构(3)——存储过程》介绍了存储过程的使用,接下来介绍一下触发器的使用。说到触发器,我们并不陌生,我们学习过程中涉及到很多相关的知识,但是欠缺的实践应用。通过这次机房收费,对触发器有了进一步的理解。

      1、简介

      触发器也是一种与表事件相关的特殊的存储过程。由事件来触发,当对一个表进行操作(insert,delete,update)时就会激活它执行。经常用于加强数据的完整性约束和业务规则等。它与存储过程的区别是触发器不能执行EXCUTE语句调用,而是在用户执行Transact_SQL语句是自动触发执行。


      2、分类

      SQL Sever包括三种常规类型的触发器:

      1)DML触发器(常用)

      如果我们对某个表谢了对应的DML触发器,当数据库表中的数据发生相应的变化时(insert,delete,update),该触发器自动执行。其主要作用是强制执行业务规则,扩展SQL sever 约束、默认值等。

      可分为:

      a、AFTER 触发器

        包括insert触发器、update触发器和delete触发器,在这些操作执行后触发器才能触发,且只能定义在表上。

      b、INSTEAD OF 触发器

        并不执行定义的相关操作,而是仅执行触发器本身。instead of 触发器可以在表上定义,也可以在试图上定义。

      

      2)DDL触发器

      主要用于审核与规范数据库中表、触发器、视图等结构上的操作。在数据库结构发生变化时执行(修改和新增列、新增表等),主要用来记录数据库的修改过程,以及限制程序员对数据库的修改。


      3)登录触发器

      响应LOGIN时间而激发的存储过程。登录触发器在登录的身份验证阶段完成之后切用户会话实际建立之前激发。如果身份验证失败,将不激发登录触发器。


      3、作用

      a、允许/限制对表的修改
      b、自动派生列,如自增字段
      c、强制数据的一致性
      d、提供审计和日志记录
      e 、防止无效的事务处理

      4、实例应用

      为了在实践中熟悉触发器,在机房收费注册功能中应用了触发器。以此展示触发器的创建过程。

      由插入INSERT学生信息表的数据触发此触发器,进行注册表和充值表的记录的插入操作,具体如下:

      1)在T_StuInfo表下建立触发器

      

      2)编写语句

USE [JF_sys]
GO
/****** Object:  Trigger [dbo].[Register]    Script Date: 2014/8/11 21:06:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Register]        --创建触发器
   ON  [dbo].[T_StuInfo]
   AFTER insert
AS 
	declare @CardID VARCHAR(10),       --参数
			@StuID VARCHAR(10),
			@RegDate varchar(10),
			@RegTime varchar(10),
			@UserID varchar(10),
			@RegCash varchar(15),
			@CheckStatus varchar(10)

	select @CardID=CardID ,@UserID =UserID from inserted
	select @RegCash =StuCash from inserted
	select @StuID=StuID from inserted
	
	set @RegDate =CONVERT (varchar (10),GETDATE (),120)   --获取日期
	set @RegTime =CONVERT (varchar (10),GETDATE (),108)   --获取时间


BEGIN
    --引发操作:向注册表和充值表中插入数据
	insert into T_RegInfo (CardID ,StuID ,RegDate ,RegTime ,UserID ,RegCash ,CheckStatus ) values (@CardID , @StuID,@RegDate,@RegTime,@UserID,@RegCash,'未结账')
	insert into T_RechargeInfo (CardID,RecDate,RecTime,RecCash,UserID,CheckStatus ) VALUES (@CardID ,@RegDate ,@RegTime ,@RegCash,@UserID,'未结账')
END

      对新知识的应用可能存在欠缺,如有不恰当的地方,欢迎大家指出!