SQL触发器(AFTER和INSTEAD OF)
转自:http://www.cnblogs.com/shepherldeng/archive/2010/06/23/1763766.html
何为触发器:触发器是数据库服务器中发生事件时自动执行的特种存储过程,这是帮助文档上的定义,就认为是一种特殊的存储过程也行,经常用于强制执行业务规则和数据完整性。 在正式操作之前先把触发器原理给说说,理解好触发器的机制是对更好的运用触发器自己好处很明显。 1、原理: 在执行触发器的过程中会产生两张临时表INSERTED 和DELETED,这两张表的作用简单说就是拿来记录数据的,主我们可以在触发器执行过程中更好的对数据进行操作 对表执行INSERT和UPDATE操作时都会在临时表INSERTED中拷贝一份所增加的数据。 对表执行DELETE和UPDATE操作时都会在临时表DELETED中拷贝一份所删除的数据 对表执行UPDATE操作时,首先把UPDATE前的数据DELETE到DELETED临时表中,然后再把所要更新的数据插入表中,最后把更新后的数据拷贝到INSERTED临时表中 触发器分为两种AFTER和INSTEAD OF 2、AFTER 字面意思就是在对表执行INSERT、UPDATE、DELETE操作后触发的触发器了,这里以INSERT结合触发器原理简单描述其过程 当有INSERT语句要执行时,首先直接执行INSERT语句,再就是AFTER执行触发器里面的操作(把数据拷贝到临时表INSERTED中,然后进行我们想要的操作,最后完成同样删除了临时 表) 下面就开始进行实例演示了: 01
--学生
02
create table Student
03
(
04
StudentNo int primary key,
05
StudentName varchar(20) not null
06
)
07
--书本
08
create table Book
09
(
10
BookId int identity(1,1),
11
BookName varchar(30),
12
Owner int foreign key references Student(StudentNo)
13
)
14
insert into Student values(1,'ShepherlDeng')
15
insert into Student values(2,'Divi')
16
insert into Student values(3,'Lili')
17
insert into Book values('Book--01',1)
18
insert into Book values('Book--02',2)
19
insert into Book values('Book--01',3)
20
insert into Book values('Book--02',1)
21
insert into Book values('Book--03',2)
22
insert into Book values('Book--03',3)
23
insert into Book values('Book--04',1)
24
insert into Book values('Book--04',2)
25
insert into Book values('Book--01',3)
如果我们有这样一个业务需求,就是当有一个学生时,必须买Book--01这一本书 于是我们可以写个简单的AFTER触发器 1
CREATE TRIGGER itStudent
2
on Student
3
after Insert
4
as
5
begin
6
declare @studentNo int
7
select @studentNo=StudentNo from Inserted
8
insert into Book values('Book--01',@studentNo)
9
end
当我们增加一条记录时就会自动在Book表中增加一条记录,这里其它操作也很相像所以不多说了只要知道是在操作守后再执行,重点放在INSTEAD OF触发器上。 3、INSTEAD OF 字面意思为取代,难道说当在一张表上定义了这样的触发器后,对表所做的INSERT、UPDATE、DELETE操作会被替换掉而不执行了?呵呵…这种触发器执行过程为: 当对表执行INSERT等操作时,并不直接执行这些操作而是转到触发器里面来执行触发器所定义的操作语句(应该说是一起执行的更合适); 演示仍然为上面的所创建的表首先我们演示一个级联删除,当我们在Student表中删除一个被Book引用记录时因为有完整无缺约束我们无法删除这是INSTEAD OF就有作用了 1
CREATE TRIGGER dtStudent
2
on Student
3
instead of Delete
4
as
5
begin
6
declare @studentNo int
7
select @studentNo=StudentNo from Deleted
8
delete Book where Owner=@studentNo
9
end
呵呵这是不是很爽呢…… 那我们再来演示一个UPDATE的INSTEAD OF触发器的操作 01
Create Trigger utStudent
02
on Student
03
instead of Update
04
as
05
begin
06
declare @studentNo int,
07
@studentNold int
08
if update(StudentNo)
09
begin
10
select @studentNold=StudentNo from Deleted
11
select @studentNo=StudentNo from Inserted
12
update Book set Owner=@studentNo where Owner=@studentNold
13
end
14
end
这会是什么结果呢?执行后就会发现当你更改StudentNo是它的子表Book中的Owner也会一起改变了… 我还是觉得触发器能解决的好像存储过程也可以,以前也用存储过程写级联删除感觉要比这个要繁琐点,还有人说触发器是高手用的,总之各有各的应用场景了看怎么用了。
SQL触发器(AFTER和INSTEAD OF)的更多相关文章
- SQL触发器实例讲解
SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Inser ...
- SQL触发器实例
SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分 ...
- SQL触发器中的deleted表和inserted表
SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...
- SQL 触发器(学生,课程表,选修表)
SQL 触发器(学生,课程表,选修表) 触发器是一种特殊类型的存储过程,它不由用户通过命令来执行,而是在用户对表执行了插入,删除或修改表中数据等操作时激活执行.可以这样形容:存储过程像一个遥控炸弹,我 ...
- Oracle数据库之PL/SQL触发器
Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...
- PB+MS SQL+触发器必须指出
PB+MS SQL+触发器必须指出: 若触发器存在两笔以上的返回值,比方两条update 语句,被误判为数据有改变.存盘不成功. 提示: Row changed between retrieve an ...
- SQL触发器实例(下)
基本语法: Create Trigger [TriggerName] ON [TableName] FOR [Insert][,Delete][,Update] AS --触发器要执行的操作语句. G ...
- SQL 触发器-如何查看当前数据库中有哪些触发器
在查询分析器中运行: use 数据库名goselect * from sysobjects where xtype='TR' sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记 ...
- 【SQL Server】SQL触发器经验详解
[SQL Server]SQL触发器经验详解 | 浏览: 4314 | 更新: 2013-01-07 15:33 25 11 全文阅读分步阅读 加入杂志 步骤 1 2 3 4 5 6 7 8 ...
- SQL触发器 inset自学经验
本人建立了一个特价汇网站,想要记录每个商品的点击量和整个网站的访问量,于是就想用sql 触发器来实现 drop trigger tgr_cg_records_update_column create ...
随机推荐
- dts--tests(三)
sample_built.py """ DPDK Test suite. Test sample_built. """ import uti ...
- 如何理解MVVM?
随着前端页面越来越复杂,用户对于交互性要求也越来越高,MVVM模型应运而生. MVVM最早由微软提出来,它借鉴了桌面应用程序的MVC思想,在前端页面中,把Model用纯JavaScript对象表示,V ...
- Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec
本话题会涉及到: Lo.Hi.HiByte.LoWord.HiWord.MakeWord.MakeLong.Int64Rec 譬如有一个 Cardinal 类型的整数: 1144201745其十六进制 ...
- 子查询,用户管理,pymysql使用
当我们的一条记录 分散不同的表中时,就需要进行多表查询例如 一对一 一对多 多对多 1.笛卡尔积查询 意思就是将两个表中的所有数据 全部关联在一起例如A表有两条 B表有三条 一共有6条会产生大量的错误 ...
- pytorch中词向量生成的原理
pytorch中的词向量的使用 在pytorch我们使用nn.embedding进行词嵌入的工作. 具体用法就是: import torch word_to_ix={'hello':0,'world' ...
- C语言数组篇(三)字符空间 和 非字符空间
一维数组和字符串 首先是字符数组(区别字符串) ] = {'a','b','c'}; //这只是单纯的字符数组,不是字符串 字符串最重要的标志就是结尾有一个'\0' ...
- easypoi 一行代码搞定excel导入导出
开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子[easypoi],下面介绍下“轮子”的使用. pom ...
- [KMP][BZOJ1355][Baltic2009]Radio Transmission
题面 Description 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. Input 第一行给出字符串的长度,\(1 < L ...
- 散列--数据结构与算法JavaScript描述(8)
散列 散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用. 散列使用的数据结构叫做散列表. 在散列表上插入.删除和取用数据都非常快,但是对于查找操作来说却效率低下,比如查找一组数据中的最大 ...
- 5,MongoDB 之 "$" 的奇妙用法
在MongoDB中有一个非常神奇的符号 "$" "$" 在 update 中 加上关键字 就 变成了 修改器 其实 "$" 字符 独立出现 ...