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、在触发器中尽量避免耗时及复杂的操作
SqlServer--学习触发器的更多相关文章
- SQLServer 学习笔记之超详细基础SQL语句 Part 8
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 7------------------- --触发器str_trigge ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 7
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 6------------------- 29 存储过程和触发器 存储过 ...
- SQLServer学习笔记系列6
一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...
- SQLServer学习笔记系列5
一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...
- SQLServer学习笔记系列3
一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...
- SQLServer学习笔记系列2
一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步 ...
- SQLServer学习笔记<>相关子查询及复杂查询
二.查询缺少值的查询 在这里我们加入要查询2008年每一天的订单有多少?首先我们可以查询下订单表的订单日期在2008年的所有订单信息. 1 select distinct orderdate,coun ...
- sqlserver数据库触发器调用外部exe
sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...
- SqlServer添加触发器死锁的原因
之前遇到过SqlServer添加触发器死锁的情况,纠结了很长时间 最近发现原来是因为我在建表的时候,把id设成主键后,系统默认了加一个聚集的索引 就是聚集索引把表锁住了
- SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 11------------------- 现在,我们希望从 " ...
随机推荐
- REBXOR
题面 Description 给定一个含N个元素的数组A,下标从1开始.请找出下面式子的最大值. (A[l1]xorA[l2+1]xor-xorA[r1])+(A[l2]xorA[l2+1]xor-x ...
- @RequestParam,@PathVariable,@ResponseBody,@RequestBody,@ModelAttribute学习
1.@RequestParam使用于参数上,用于将请求参数映射到指定参数变量上 例如: @RequestMapping(value="/hello",method=RequestM ...
- phonegap工程中修改app的名字
针对phonegap比较高的版本,我的是6.4.0. 在phonegap工程中,当添加了iOS和android平台或多个平台后,工程进行了开发,然后觉得app的名字想修改一下(比如在手机上显示的app ...
- 百科知识 isz文件如何打开
使用UltraISO可以打开
- css3 - 基本选择器
有人说类选择器最好不要超过三层,其实我也是这样认为的,不是吗? 选择器分为四大类 标签.全选(相对于子类继承了0.1).类.ID 权值分别是:1->0.1->10->100(权值可叠 ...
- openssl之BIO系列之12---文件描写叙述符(fd)类型BIO
文件描写叙述符(fd)类型BIO ---依据openssl doc\crypto\bio_s_fd.pod翻译和自己的理解写成 (作者:DragonKing Mailwzhah@263.net 公布于 ...
- 无法访问gcr.io的几种解决办法
系列目录 由于一些原因,在国内无法访问gcr.io上的镜像,在安装kubernetes时,很多官方镜像又是都存在gcr.io上,在国内的一些教程中大都使用阿里云的镜像,但是由于阿里云镜像地址更换等原因 ...
- input输入框输入大小写字母自动转换
input输入框输入小写字母自动转换成大写字母有两种方法 1.用js onkeyup事件,即时把字母转换为大写字母: html里input加上 <input type="text&qu ...
- android日历控件
源码地址 : http://download.csdn.net/detail/abc13939746593/7265459
- 解决Linq.ToDictionary()时的键重复问题
今天在使用 Linq 的 ToDictionary() 时发生了异常,提示: System.ArgumentException: 已添加了具有相同键 因为以前一直没有遇到有相同键的情况,所以从来没关注 ...