MSSQL after触发器简介


一、MSSQL After 触发器

作为一名企业IT运维人员,由于我们无法修改源代码来改变程序的逻辑,我们常常需要从数据库的角度来处理一些逻辑业务,改变数据的约束,增删改模式, 所以触发器就成为我们工作中的必备神器。
例:最近连锁总部的管理人员说:
当连锁总部的人,进行商品编码的添加时,所有店面的编码都应该被添加,在我们没有后台代码时,此时我们只能从数据库上入手处理处理这个需求。
我们首先想到的就是监控表,当表有数据插入时,就触发另外一个批量编码插入操作,此时我们就需要使用数据库一个功能,那就是mssql after 触发器。

After 触发器定义

after触发器属于DML触发器,当表发生insert update delete 动作之后触发的sql
after触发器的触发方式:当对表进行一次insert 或 update 或 delete 就会触发一次触发器操作,触发器的触发动作不会因为一次插入多条记录而触发多次,也不会因为一次更新多条记录,一次删除多条记录而触发多次操作。
after触发器中:获取insert update delete 所涉及的数据需要使用以下表
inserted表
deleted表



当我们进行insert操作时, mssql会插入将数据至物理表中,并同时会缓存至虚拟表inserted表中
当我们进行delete操作时,mssql会将符合条件的数据清除,并同时将清除的数据缓存至虚拟表deleted表中
当我们进行update 操作时,mssql首先将更新前符合条件的数据放入deleted中,然后将更新后的相关数据放入inserted表中。

我们在after触发器中,始终需要围绕着以上两个虚拟表展开其它的相关操作。
after触发器的执行时间:当insert 或update 或delete 执行成功后,才会触发after触发器操作。
after触发器个数:一个表或视图可以拥有多个after触发器
after触发器:触发器中的sql语句,可以作为一个完整的代码块,进行事务的处理

二、MSSQL After 举例应用

 create table A(compId int,keyId int,info varchar(20))
go 

create trigger tr_A on A for insert, update ,delete 
as 
begin 
     create table #t(compId int,keyId int, info varchar(20))  
     insert into #t(compId,keyId,info) select compIdkeyId,info from inserted   
     if exists(select null from #t where compId ='0000') ----存在总部插入数据
     begin 
       insert into A(compId,keyId,info)
       select b.compId,a.keyId,a.info from #t a full join 公司表 b  on 1=1  where b.compId !='0000'  ---将当前插入数据复制至所有公司同步插入
     end 
     truncate table #t 
     drop table #t 
   
end 


truncate table A
drop table A