SqlServer--学习触发器
触发器是一种特殊的存储过程,一种不能被显式执行,而必须依附于一个事件的过程
主要作用:自动化操作;减少手动操作以及出错的几率.
触发器分类:DML(Data Manipulation Language 数据操纵语言)触发器对应数据操作事件(如Insert/Update)
DDL(Data Delfinition Language 数据定义语言)触发器对应数据定义事件(如Create Table)
DML触发器
分为:After触发器是在语句执行完毕之后触发,只能建立在常规表上;
Instead of触发器是用替换原本的要执行的语句(操作),可以建立在常规表和视图上;
语法:
create trigger 触发器 on 表名 after(for)(for与after都表示after触发器) | instead of Insert|Update|Delete(其一) as begin ...(执行语句) end例如下面Info表
uId uName 1 张三 先看看 如何创建after触发器
--创建insert的after触发器 --在触发器中,有Inserted表和Deleted表包含触发器触发而受影响的数据 --Inserted表和Deleted表与触发器所在的表结构相同(只是没有索引) --如果需要多次访问Inserted和Deleted表,并改其中一行:临时表 并为临时表创建索引 create trigger tri_Info_insert_after on info after insert as begin declare @Id int, @Name varchar(20) select @Id=uId,@Name=uName from inserted --这里取数据是从Inserted表中取(看下图) print @Id print @Name end --插入一条数据(uId是自动增长的主键) insert into Info(uName) values('bhqy')
上面创建一个简单触发器 现在用图片(一图解千愁,虽然难看了点)来好好理解触发器再来看看delete和update的after触发器
--delete的after触发器 create trigger tri_info_after_delete on info after delete as begin declare @Name varchar(100),@OldData varchar(100) select @OldData=uName from Info --从Info表取要删除的数据 select @Name=uName from deleted --从Deleted表取删除的数据 print @Name print @OldData end --执行delete语句 delete from Info where uId=2 --结果为:@Name为'代管其' @OldData为 空 --得出图中delete结论:将Info表中数据放到了deleted表中 --update的after触发器 create trigger tri_info_after_update on info after update as begin declare @OldName varchar(20), @NewName varchar(20), @OtherData varchar(20) select @OtherData=uName from Info where uId=10 --先从Info表中取数据看是不是已经修改过的 select @OldName=uName from deleted --从deleted表取旧数据 select @NewName=uName from inserted --从inserted表取新数据 print @OldName print @NewName print @OtherData end --执行update语句 update Info set uName='byqh' where uId=1 --结果为:@OldName为'宋元良' @NewName为'byqh' --得出图中update语句结论:将Info表中要修改(未修改的)数据放到deleted表中,在Info表修改数据,然后修改过的数据放到inserted表中
instead of触发器
--创建delete的instead of触发器 create trigger tri_info_instead_of on info instead of delete as begin declare @newId int insert into info(uName)values('hello') --插入一条名称为hello的人 select @newId=@@IDENTITY print @newId --打印 刚刚插入的hello的uId end delete from Info where uId=2 --你猜猜执行完该语句的时候 uId为2的数据还在吗?
DML触发器总结
相同点:按语句触发,而不是按被影响的行触发的
不同点:1、after 在语句执行完毕之后触发;只触发一次;只可以建立在常规表上;可以递归触发,最高可达32级.
2、instead of 用来替换原本的操作;不会递归触发;可以在约束被检查之前触发;可以建在表和视图上
触发器可以在表中数据发生变化时自动强制执行,触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能.
注意:1、触发器是事务的一部分,在事务期间资源会被锁定.根据要要执行的操作和隔离的级别,锁会保持到事务结束。
2、在触发器中尽量避免耗时及复杂的操作
作者:秋壶冰月
出处:
http://www.cnblogs.com/qq0827
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给原文链接,否则保留追究法律责任的权利。