SQLServer-为代码减负之触发器

2015-07-24 06:10:33 · 作者: · 浏览: 0
触发器是一张表的增删改操作,引起或触发对另一张表的增删改操作,所以触发器便有3种类型,分别是deleted触发器,Update触发器,insert触发器
触发器又根据替换原来的增删改操作,还是在原来的增删改完成之后进行增删改操作,分为Instead of触发器和For或者After触发器(for和after属于一种触发器)
触发器的使用涉及到两张非常重要的表用来保存已经改变或者已经在第一章被操作的表上不存在的记录,分别是虚拟表Inserted和虚拟表Deleted

         

虚拟表Inserted

虚拟表Deleted

在表记录新增时

存放新增的记录

不存储记录

修改时

存放用来更新的新记录

存放更新前的记录

删除时

不存储记录

存放被删除的记录

下面举一个在机房收费 系统重构个人版中用到的易于理解的关于触发器的小例子
在我们删除T_OnWork_info表中的正在上机工作记录时,同时向T_Work_info表中写入工作记录,还同时将T_Admin_info表中的IsOn字段改为False
CREATE TRIGGER trigger_delOnWork
 
ON T_OnWork_info
 
FOR DELETE
 
AS
 
DECLARE @name varchar(10)
DECLARE @loginDate varchar(10)
DECLARE @loginTime varchar(10)
DECLARE @logoutDate varchar(10)
DECLARE @logoutTime varchar(10)
DECLARE @comName varchar(10)
 
SELECT @name =(SELECT NAME FROM deleted )
SELECT @loginDate =(SELECT loginDate  FROM deleted )-----deleted表用于存储T_OnWork表中已经删除的记录
SELECT @loginTime =(sELECT loginTime  FROM deleted )
SELECT @comName =(SELECT comName  FROM deleted )
SET @logoutDate=convert(varchar(10),getdate(),101)
SET @logoutTime =convert(varchar(10),getdate(),108)
 
if (SELECT COUNT(*) FROM deleted  )=1
 
BEGIN
 
INSERT INTO T_Work_info(Name,loginDate,loginTime,logoutDate,logoutTime,comName) VALUES(@name,@loginDate ,@loginTime ,@logoutDate,@logoutTime,@comName )
 
UPDATE T_Admin_info SET IsOn='False' WHERE Name=(SELECT Name FROM deleted )
 
ROLLBACK TRAN     --事务回滚
 
END
怎么样,触发器很简单吧,大家可以尝试着用用,触发器+事务的回滚机制,很容易地做到了为代码减负