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------------------- 现在,我们希望从 " ...
随机推荐
- 多核服务器的JVM优化选项(转载)
原文链接 现在多核CPU是主流.利用多核技术,可以有效发挥硬件的能力,提升吞吐量,对于Java程序,可以实现并发垃圾收集.但是Java利用多核技术也带来了一些问题,主要是多线程共享内存引起了.目前内存 ...
- 自定义PropertyGrid控件【转】
自定义PropertyGrid控件 这篇随笔其实是从别人博客上载录的.感觉很有价值,整理了一下放在了我自己的博客上,希望原作者不要介意. 可自定义PropertyGrid控件的属性.也可将属性名称显示 ...
- Neutron网络入门
Neutron是OpenStack核心项目之中的一个,提供云计算环境下的虚拟网络功能.Neutron的功能日益强大,并在Horizon面板中已经集成该模块.作为Neutron的核心开发人员之中的一个. ...
- java内存模型(Java Memory Model)
内容导航: Java内存模型 硬件存储体系结构 Java内存模型和硬件存储体系之间的桥梁: 共享对象的可见性 竞争条件 Java内存模型规定了JVM怎样与计算机存储系统(RAM)协调工作.JVM是一个 ...
- 关于CUDA两种API:Runtime API 和 Driver API
CUDA 眼下有两种不同的 API:Runtime API 和 Driver API,两种 API 各有其适用的范围. 高级API(cuda_runtime.h)是一种C++ ...
- Kick the ball!(dfs)湖南省赛第十届
Problem K: Kick the ball! Time Limit: 1 Sec Memory Limit: 128 MB Special Judge Submit: 109 Solved ...
- overflow滚动条样式设置,ie和webkit内核
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C++ "#"的作用和使用方法
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/48879093 1 #和##的作用和使用 ...
- unittest相关文档
文档链接: http://blog.csdn.net/wangst4321/article/details/8454118
- ecshop忘记管理员密码
直接修改数据表 ecs_admin_user, 找到对应的管理员, 同时修改 password 为 2fc3ec4c91d51bee94f4a8ccbdbe5383 和 ec_salt 为1819, ...
