今天第一次使用SQL Server中的触发器感觉很方便,本文将简单的向大家介绍一下SQL Server中的触发器以及其简单的使用。我会从其定义、原理、具体的用法分别大家讲述。
定义
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由某个事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。
原理
触发器可以查询其他表,而且可以包含复杂的SQL语句。触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。
SQLServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。
DML触发器
当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。
DDL触发器
它是SqlServer2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。
登录触发器
登录触发器将为响应LOGON事件而激发存储过程。
具体用法
再敲机房收费系统的时候,在涉及到学生上下机的时候,我们就要对T_Line和T_Online这两张表进行操作,下机的时候我们需要删除T_Online表中的信息将它写入T_Line中。采用三层架构重构时,顿时觉得从一个表中得到数据返回U层再将其赋值给另一个实体当作参数最终传入另一张表中很是麻烦。于是我就想到了触发器。
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: <老牛>-- Create date: <2014-6-2 15:28:00>-- Description: <删除正在上机的学生时同时将相关信-- 息添加到学生上机记录表中>-- =============================================CREATE TRIGGER [dbo].[triq_T_OnlineDelete] ON [dbo].[T_Online] instead of InsertAS BEGIN declare @CardNo numeric(11, 0) declare @studentNo numeric(11, 0) declare @studentName varchar(10) --获取参数信息 select @CardNo=cardNo,@studentNo=studentNo ,@studentName=studentName from deleted --添加学生上机记录 insert into T_Line (cardNo,studentNo ,studentName ) values (@CardNo,@studentNo,@studentName) --删除正在上机的学生信息 delete T_Online where cardNo [email protected]ENDGO
(PS:上段代码(经测试正确)只用到了表中的几个字段其他字段也可用类似方法,特别要注意的是怎样获取下机时间(hh-mm-ss)和下机日期(yyyy-mm-dd),例如:Select CONVERT(varchar(100),GETDATE(), 24;Select CONVERT (varchar(10),getdate(),120))
心得体会
写到这里又想起了那句话“不将就是发现的原动力”,我们学习过程中也用到SQL Server一段时间了,之前我们也接触到了很多理论上的东西总感觉很高深的样子,总想着我会简单的增删改查就能解决目前的问题了。只有我们不再将就的时候我们学习了新的技术,才会感觉到,原来也就这么回事。