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------------------- 现在,我们希望从 " ...
随机推荐
- bubble chat listview
最近在iOS中用到bubble chat listview,找了个比较有名气的lib(MessagesTableViewController)=>https://github.com/jesse ...
- myBatis-plus异常提示For input string: "{0=null}"
异常信息 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Per ...
- 何时才使用https访问项目
利用keytools生产证书,然后将证书导入到jvm和tomcat中,则访问该项目的时候就以https访问
- python_获得列表中重复的项的索引
a = ['b','a', 'b', 'c', 'a', 'c','d'] b=[] f=[] for i in a: c=[] for item in enumerate(a): if item[1 ...
- SwitchyOmega 代理设置
1.SwitchyOmega官网 https://www.switchyomega.com/ 2.下载插件 https://www.switchyomega.com/download.html 3.配 ...
- Codeforces Round #277 (Div. 2)D(树形DP计数类)
D. Valid Sets time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- allegro设置鼠标滚轮放大缩小
allegro设置鼠标滚轮放大缩小 allegro16版本以增加可以通过鼠标滚轮进行PCB的放大缩小.具体方法如下: 首先在HOME路径下找到PCBENV文件夹,进入该文件夹打开ENV文件. 在ENV ...
- 斯坦福公开课:Developing IOS 8 App with Swift(1-3)心得体会
最近开始学习Swift开发移动程序.跟随斯坦福大学的公开课进行自学. 这真是一个美好的时代,虽然不能在斯坦福求学,但是可以观看录制的授课录像.讲义,好似老师在给我们上课一样! 心得: 1.每节课信息量 ...
- iOS开发 - UIViewController控制器管理
创建一个控制器 控制器常见的创建方式有下面几种 //通过storyboard创建 //直接创建 ViewController *vc = [[ViewController alloc] init]; ...
- JAVA调用命令行2
package loadMBQL; import java.io.File; import java.io.FilenameFilter; public class LoadMBQL { /** * ...
