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------------------- 现在,我们希望从 " ...
随机推荐
- layer的alert、prompt等操作如何响应键盘的回车和ESC操作
layer.prompt({title: '请输入数据', formType: 1, //隐藏用户输入内容 // 这个是确定按钮的事件 "success":function(){ ...
- mysql 分表的3种方法
http://blog.51yip.com/mysql/949.html CSDN - Mysql MERGE分表对大数据量的处理 实战经验: 要分表的表引擎必须是myisam类型 ...
- Num 34 : HDOJ : 1205 吃糖果 [ 狄利克雷抽屉原理 ]
抽屉原理: 桌上有十个苹果,要把这十个苹果放到九个抽屉里,不管如何放,我们会发现至少会有一个抽屉里面至少放两个苹果. 这一现象就是我们所说的" ...
- C中參数个数可变的函数
一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一 ...
- kubernetes对象之deployment
系列目录 简述 Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用.典型的应 ...
- 2016年最值得新手程序猿阅读的书:《增长project师指南》
这本书的来源于根据我在<Repractise简单介绍篇:Web开发的七天里>中所说的 Web 开发的七个步骤而展开的电子书.当然它也是一个 APP.它一本关于怎样成为增长project师的 ...
- IP和归属地
ip: http://www.ip.cn/index.php?ip=10.132.98.143 归属地: http://www.ip138.com:8080/search.asp?action=mob ...
- UVA 12130 - Summits(BFS+贪心)
UVA 12130 - Summits 题目链接 题意:给定一个h * w的图,每一个位置有一个值.如今要求出这个图上的峰顶有多少个.峰顶是这样定义的.有一个d值,假设一个位置是峰顶.那么它不能走到不 ...
- Spring整合Hibernate的方法
一.基本支持 Spring 支持大多数流行的 ORM 框架, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA. Spring 对这些 ORM 框架的支持是一致的, 因此 ...
- jQuery 给div绑定单击事件
说明:这篇随笔介绍的是怎么给div添加单击(click)事件.不再废话 直接看代码 <%@ Page Language="C#" AutoEventWireup=" ...
