SQL Server2005中触发器的运用

article/2025/10/9 11:12:29

编写过存储过程的人,再编写触发器时会发现:他们的语法、格式是非常类似的。其实触发器就是一种特殊类型的存储过程。他们都是预编译的,在程序正式编译前就由编译器进行编译,存储在服务器端。

 

不过,触发器与一般的存储过程也有些区别。触发器主要是通过对数据库的增删改的操作,或者是一个触发动作的触发作用等事件触发而被执行;而存储过程则是通过像传递SQL语句一样,传递存储过程的名字来被程序调用,实现功能。

 

触发器一共分为五种类型:Update触发器,Insert触发器、Delete触发器、Instead of触发器和After触发器。前三个分别是相应表上进行更新、插入、删除操作时触发。Instead of触发器在不执行插入、更新或删除操作时触发。

 

在触发器中存在两个虚拟表:Inserted表和Deleted表。Inserted表保存的是Insert或Update之后所影响的记录形成的表,Deleted保存的是Delete或update之前所影响的记录形成的表。这两个表是逻辑表,这两个表是动态驻留在内存中的,当触发器工作完成,这两个表也被删除。

 

触发器的创建代码格式:

CREATE TRIGGER trigger_name      --触发器的名字
ON table|view [WITH ENCRYPTION]  --在哪个表上创建触发器
{ FOR | AFTER | INSTEAD OF }     
{[INSERT][,][UPDATE][,][DELETE]} --激活触发器的类型
AS sql_statements […n]

 

代码中关键字for、after、Insteadof分别代表不同的使用范围:

for表示为AFTER触发器,且该类型触发器仅能在表上创建;

after表示只有在执行了指定的操作INSERTDELETEUPDATE之后触发器才被激活,执行触发器中的SQL语句;

instead of当为表或视图定义了针对某一操作INSERTDELETEUPDATEINSTEAD OF 类型触发器,且执行了相应的操作时,尽管触发器被触发,但相应的操作并不被执行,而运行的仅是触发器SQL语句本身。

 

下面说下触发器的作用:

1、级联修改数据库中的相关的表;

看下面的牛腩新闻发布系统的例子:其中一个新闻类别(Category)对应多个或者0条新闻;一条新闻(news)对应着多个或者0个新闻评论(comment)。

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author:		刘正权
-- Create date: 2008-11-15 11:13
-- Description:	删除新闻类别触发器
-- =============================================
CREATE TRIGGER trigCategoryDeleteON  categoryinstead of DELETE
AS 
BEGIN
--删除新闻,再在类别表中删除--触发器实现declare @caId intselect @caId=id from deleted --删除评论(选出多条用in,一条用=号)delete comment where newsId in (select newsId from news where caId=@caId)--删除新闻delete news where caId=@caId--删除类别delete category where id=@caId
END

 

2、执行比核查约束更为复杂的约束操作;在触发器中可以书写更为复杂的SQL语句,例如可以引用多个表,并使用if……else等语句做更复杂的检查。

下面看下例子:如果更改了学生的学号,则他的借书记录表中记录也同时更新。

这时候,我们可以建立一下触发器:

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		刘正权
-- Create date:2012-4-22
-- Description:	更改了学生的学号,则他的借书记录表中记录也同时更新
-- =============================================
Create Trigger truStudent 
On Student        --在Student表中创建触发器 
for Update        --为什么事件触发 
As                --事件触发后所要做的事情 
if Update(StudentID)            
begin Update BorrowRecord 
Set StudentID=i.StudentID 
From BorrowRecord br , Deleted   d ,Inserted i  --Deleted和Inserted临时表 
Where br.StudentID=d.StudentID 
end  

 

3、拒绝或回滚违反引用完整性的操作。检查对数据库的操作是否违反引用完整性,并选择相应的操作;

看下面的例子:不允许删除任何销售记录大于等于20条的商店。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		刘正权
-- Create date: 2012-4-22
-- Description:	不允许删除任何销售记录大于等于20条的商店
-- =============================================
CREATE TRIGGER trDelSalesON  tblSales  for Delete
AS if(select Count(*) from Deleted where Deleted.qty>=20)>0
BEGINprint'您不能删除任何记录'rollback transaction   --事务回滚
END
GO

 

4、比较表修改前后数据之间的差别,并根据差别才去相应的操作。

例如:若想规定每次工资的变动幅度不能超过40%,使用触发器可以将修改后的表数据和修改前的表数据进行比较,若超出40%,可以回滚该修改操作。

 

触发器是自动触发的,一旦对表中的数据做了修改,该触发器将立即被激活,充分体现了触发的优势,保持了数据的完整性;然而,触发器性能通常是比较低的。

 

当运行触发器时,系统处理的大部分时间花费在参照它表达的这一处理上,因为这些表达既不在内存中,也不在数据库设备上,而逻辑表(删除表和插入表)总是位于内存中。所以触发器参照的其他表的位置决定了操作花费时间的长短。

转载于:https://www.cnblogs.com/liu765023051/archive/2012/04/22/2813604.html


http://chatgpt.dhexx.cn/article/9kEhy3T3.shtml

相关文章

关于SimpleDateFormat安全的时间格式化线程安全问题

关于SimpleDateFormat安全的时间格式化线程安全问题 2014年02月18日 16:19:40 zxh87 阅读数:34426 想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用…

LaTex - 插入公式 (从MathType公式编辑器导入到LaTex中)

原创 LaTex 论文排版(2): 插入公式 (从MathType公式编辑器导入到LaTex中) 2019年03月08日 09:37:40 在水一方xym 阅读数 5948 更多 分类专栏: LaTex 论文排版 LaTex 论文排版 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议&…

CSS总结

自从做牛腩新闻发布系统的时候,就开始了CSS的学习。CSS这部分知识并不是孤立的,它与JavaScript,与XML,与AJAX等都有着密切的关系。在制作网页的过程中,CSS就是充当一个化妆师的角色,它能够让我们制作出各式…

大型网站应用之海量数据和高并发解决方案总结

一、网站应用背景 开发一个网站的应用程序,当用户规模比较小的时候,使用简单的:一台应用服务器一台数据库服务器一台文件服务器,这样的话完全可以解决一部分问题,也可以通过堆硬件的方式来提高网站应用的访问性能&…

ehcache memcache redis三大缓存男高音

 研究使用缓存已经有一段时间了,今天本来想对比一下它们异同以及使用场景。然后我发现已经有前辈做了很不错的总结,而且这篇文章跟我也有很多共鸣。我想说的也就这些,所以这里就直接拿来主义了。 不过,还…

技术是个王八蛋,可是长得真好看

看完题目,请勿喷。最近的生活可能太苦逼了,好想吐槽一下~~~ 首先,先来分享一段个人特别喜欢的话: 透视社会依次为三个层面:制度、文化和技术。小到一个人,大到一个国家,一个民族,任…

学习,不是一件发愁的事儿

曾经,我有一个很幼稚的想法。有人告诉我:人体的细胞,每隔七年,就会大换血一次,经历一个大的生命周期。听完我就害怕了,七年?那七年后,我现在学习的所有知识,就全被我忘干…

记一次通过Memory Analyzer分析内存泄漏的解决过程

状况描述: 最近项目新打的版本,过不了多长时间,项目就会挂掉。状况就是处于一种假死的状态。索引查询都很慢,几乎进行不了任何操作,慢慢卡死。 然后我们再发版时,只能基于之前打好的war包,替换或…

数字图像处理之尺度空间理论

尺度空间(scale space)思想最早是由Iijima于1962年提出的,后经witkin和Koenderink等人的推广逐渐得到关注,在计算机视觉领域使用广泛。 尺度空间理论的基本思想是:在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度…

为什么要用高斯核来生成尺度空间?

信号的尺度空间刚提出是就是通过一系列单参数、宽度递增的高斯滤波器将原始信号滤波得到到组低频信号。那么有一个疑问就是,除了高斯滤波之外,其他带有参数t的低通滤波器是否也可以用来生成一个尺度空间呢? 但翻看资料得知国外诸多学者都已经…

【高分论文密码】大尺度空间模拟预测与数字制图教程

详情点击链接:【高分论文密码】大尺度空间模拟预测与数字制图 一,R语言空间数据及数据挖掘关键技术 1、R语言空间数据及应用特点 1)R语言基础与数据科学 2)R空间矢量数据 3)R栅格数据 2、R语言空间数据挖掘关键技术 二,R语言空间数据高…

尺度空间及SIFT

尺度空间方法的基本思想是:在视觉信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得不同尺度下的视觉处理信息,然后综合这些信息以深入地挖掘图像的本质特征。尺度空间方法将传统的单尺度视觉信息处理技术纳入尺度不断变化的…

【高分论文密码】大尺度空间模拟预测与数字制图

大尺度空间模拟预测和数字制图技术和不确定性分析广泛应用于高分SCI论文之中,号称高分论文密码。大尺度模拟技术可以从不同时空尺度阐明农业生态环境领域的内在机理和时空变化规律,又可以为复杂的机理过程模型大尺度模拟提供技术基础。在本次培训中&…

尺度空间理论与图像金字塔(二)

SIFT简介 整理一下方便阅读,作者写的东西摘自论文,在此感谢xiaowei等的贡献 DoG尺度空间构造(Scale-space extrema detection)http://blog.csdn.net/xiaowei_cqu/article/details/8067881关键点搜索与定位(Keypoint l…

遥感空间尺度转换技术(升尺度和降尺度)

遥感图像的一个基本特征是空间分辨率。目前已经可以有效获取大量不同空间分辨率遥感数据。 尺度和尺度转换已经成为遥感的核心问题之一,人们已经从不同角度提出了这一问题。尺度转换分为两种: 升尺度:从高分辨率到低分辨率的转换;降尺度:从低分辨率到高分辨率的转换。文章…

SIFT 尺度空间

最近也注意一些图像拼接方面的文章,很多很多,尤其是全景图拼接的,实际上类似佳能相机附加的软件,好多具备全景图拼接,多幅图像自动软件实现拼接,构成(合成)一幅全景图像(…

尺度空间与图像金字塔(多分辨率)超级细致

文章目录 尺度空间 什么是尺度空间(scale space) 为什么需要尺度空间 高斯核 图像金字塔 什么是分辨率 为什么需要多分辨率 多尺度和多分辨率 图像金字塔 高斯金字塔 SIFT 参考 Why multi-scale? Why should you blur? • Computational efficiency •…

尺度空间多分辨率

今天主要介绍这两个概念的区别和一些应用! 1、尺度空间 在尺度空间中,尺度越大图像就越模糊(在有限的空间上要表达好物体,那么物体越大越模糊),尺度空间中各尺度图像的模糊程度逐渐变大, 能够…

数字图像处理9--尺度空间

《SIFT原理与源码分析》系列文章索引:http://blog.csdn.net/xiaowei_cqu/article/details/8069548 尺度空间理论 自然界中的物体随着观测 尺度不同有不同的表现形态。例如我们形容建筑物用“米”,观测分子、原子等用“纳米”。更形象的例子比如 Google地…

图像尺度空间

博主原本以为图像的尺度空间是指同一幅图像不同size构成的集合,其实不然 图像分辨率 ≠ 图像尺度 什么是尺度空间(scale space)? 图像的尺度是指图像内容的粗细程度,尺度的概念是用来模拟观察者距离物体的远近程度。…