触发器是一种特殊的存储过程,一种不能被显式执行,而必须依附于一个事件的过程

主要作用:自动化操作;减少手动操作以及出错的几率.

触发器分类: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--学习触发器的更多相关文章

  1. SQLServer 学习笔记之超详细基础SQL语句 Part 8

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 7------------------- --触发器str_trigge ...

  2. SQLServer 学习笔记之超详细基础SQL语句 Part 7

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 6------------------- 29 存储过程和触发器 存储过 ...

  3. SQLServer学习笔记系列6

    一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...

  4. SQLServer学习笔记系列5

    一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...

  5. SQLServer学习笔记系列3

    一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...

  6. SQLServer学习笔记系列2

    一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步 ...

  7. SQLServer学习笔记<>相关子查询及复杂查询

    二.查询缺少值的查询 在这里我们加入要查询2008年每一天的订单有多少?首先我们可以查询下订单表的订单日期在2008年的所有订单信息. 1 select distinct orderdate,coun ...

  8. sqlserver数据库触发器调用外部exe

    sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...

  9. SqlServer添加触发器死锁的原因

    之前遇到过SqlServer添加触发器死锁的情况,纠结了很长时间 最近发现原来是因为我在建表的时候,把id设成主键后,系统默认了加一个聚集的索引 就是聚集索引把表锁住了

  10. SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 11------------------- 现在,我们希望从 " ...

随机推荐

  1. layer的alert、prompt等操作如何响应键盘的回车和ESC操作

    layer.prompt({title: '请输入数据', formType: 1, //隐藏用户输入内容 // 这个是确定按钮的事件 "success":function(){ ...

  2. mysql 分表的3种方法

    http://blog.51yip.com/mysql/949.html       CSDN - Mysql MERGE分表对大数据量的处理     实战经验: 要分表的表引擎必须是myisam类型 ...

  3. Num 34 : HDOJ : 1205 吃糖果 [ 狄利克雷抽屉原理 ]

           抽屉原理:          桌上有十个苹果,要把这十个苹果放到九个抽屉里,不管如何放,我们会发现至少会有一个抽屉里面至少放两个苹果.          这一现象就是我们所说的" ...

  4. C中參数个数可变的函数

    一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一 ...

  5. kubernetes对象之deployment

    系列目录 简述 Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用.典型的应 ...

  6. 2016年最值得新手程序猿阅读的书:《增长project师指南》

    这本书的来源于根据我在<Repractise简单介绍篇:Web开发的七天里>中所说的 Web 开发的七个步骤而展开的电子书.当然它也是一个 APP.它一本关于怎样成为增长project师的 ...

  7. IP和归属地

    ip: http://www.ip.cn/index.php?ip=10.132.98.143 归属地: http://www.ip138.com:8080/search.asp?action=mob ...

  8. UVA 12130 - Summits(BFS+贪心)

    UVA 12130 - Summits 题目链接 题意:给定一个h * w的图,每一个位置有一个值.如今要求出这个图上的峰顶有多少个.峰顶是这样定义的.有一个d值,假设一个位置是峰顶.那么它不能走到不 ...

  9. Spring整合Hibernate的方法

    一.基本支持 Spring 支持大多数流行的 ORM 框架, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA. Spring 对这些 ORM 框架的支持是一致的, 因此 ...

  10. jQuery 给div绑定单击事件

    说明:这篇随笔介绍的是怎么给div添加单击(click)事件.不再废话 直接看代码 <%@ Page Language="C#" AutoEventWireup=" ...