机房重构(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

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

      

      

原文地址:https://www.cnblogs.com/gcczhongduan/p/3983064.html