首页 > 对AFTER触发器的一些整理

对AFTER触发器的一些整理

将AFTER触发器的一些特性和注意事项整理一下,注意以下内容仅适用于MSSQL系列。

1、什么时机触发

在语句执行后触发,注意不论此语句影响了多少行数据(包括0行),都只触发一次。如果原语句因为违反约束等原因未生效,触发器不被触发。

 

2、触发器SQL与原SQL是一个事务吗

是的,也就是说,如果触发器SQL执行失败了,原SQL也会不成功。

 

3、同类型的多个触发器冲突吗

如果定义了多个同类型的触发器比如INSERT,除了能定义哪个最先执行和哪个最后执行外,其它的无法控制,是无序串行执行的。

 

4、inserted表和deleted表的作用

这是两个特殊的表,inserted表包含了受影响行数据的新镜像,deleted表包含了旧镜像。简单点说,你把一行数据从AAA改成BBB,那么在inserted表中此记录是BBB,deleted表中是AAA。

这两个表都与触发器所在表保持同构,但没有索引。

对INSERT操作,只有inserted表有数据,对DELETE操作,只有deleted表有数据,对UPDATE操作,两张表都有数据。

 

5、如何识别触发器类型

如果一个触发器同时处理INSERT/UDPATE/DELETE操作,又想识别出具体操作,一般的做法是通过inserted表和deleted表来判断,如下:

  1. IF(EXISTS(SELECT * FROM inserted))  
  2. BEGIN  
  3.     IF(EXISTS(SELECT * FROM deleted))  
  4.         --有ins也有del,是UPDATE操作  
  5.     ELSE  
  6.         --有ins无del,是INSERT操作  
  7. END  
  8. ELSE  
  9. BEGIN  
  10.     --无ins有del,是DELETE操作  
  11. END 

6、如何处理指定列的更新

通过UPDATE()方法来判断,传入列名。 

 

7、怎样才能逐一处理受影响的数据

除非能构造出合适的SQL语句,否则一般情况都是用游标。随便给个例子:

  1. CREATE TRIGGER [dbo].[TriggerName] 
  2. ON [dbo].[TableName] 
  3. AFTER UPDATE      --定义的是UPDATE的后触发器 
  4. AS 
  5. BEGIN 
  6.     --无受影响行,直接返回 
  7.     IF(@@rowcount = 0) 
  8.         RETURN 
  9.  
  10.     DECLARE @tag INT 
  11.     --定义并打开一个游标cur,用于从修改后的数据中查一下Tag字段的值 
  12.     DECLARE cur CURSOR FAST_FORWARD FOR 
  13.         SELECT Tag FROM inserted 
  14.     OPEN cur 
  15.  
  16.     --通过游标取数据,把结果放到@tag中 
  17.     FETCH NEXT FROM cur INTO @tag 
  18.     WHILE(@@fetch_status = 0) 
  19.     BEGIN 
  20.         --根据@tag来做一些处理,然后再取一条,直到@@fetch_status不为0 
  21.         FETCH NEXT FROM cur INTO @tag 
  22.     END 
  23.  
  24.     --关闭游标并释放资源 
  25.     CLOSE cur 
  26.     DEALLOCATE cur 
  27. END 

 

 

 

 

 

更多相关:

  • 1,触发器有两种     (1)After触发器(之后触发)     触发器有个好处:就是你之前有过什么操作他会将你的操作的数据信息完整的保存下来,比如你删过什么信息,如果用触发器,那么删除后就会显示两行受影响,那么我们要做的思路就是将删除后的信息保存到一个新表中,就得克隆一张操作数据的表。比如     操作表:Tb_Student...

  • 第9章 触发器 入的新数据放到new表,删除的数据放到old表。 准备本章学习环境 连接数据库schoolDB,删除表TStudent,TScore和Tsubject中的所有数据。 delete from TStudent; delete from TScore; delete from TSubject; 向学生表插入两条记录 i...

  • 本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:【公众号dotNet工控上位机:thinger_swj】基于Socket访问西门子PLC系列教程(一)在完成上述步骤后,接下来就是编写上位机软件与PLC之间进行通信。上位机UI界面设计如下图所示:从上图可以看出...

  • 我有一个大型数据集,列出了在全国不同地区销售的竞争对手产品。我希望通过使用这些新数据帧名称中的列值的迭代过程,根据区域将该数据帧分成几个其他区域,以便我可以分别处理每个数据帧-例如根据价格对每个地区的信息进行排序,以了解每个地区的市场情况。我给出了以下数据的简化版本:Competitor Region ProductA Product...

  • 作为一名IT从业者,我来回答一下这个问题。首先,对于具有Java编程基础的人来说,学习Python的初期并不会遇到太大的障碍,但是要结合自己的发展规划来制定学习规划,尤其要重视学习方向的选择。Java与Python都是比较典型的全场景编程语言,相比于Java语言来说,当前Python语言在大数据、人工智能领域的应用更为广泛一些,而且大...

  • 这段时间通过学习相关的知识,最大的变化就是看待事物更加喜欢去了解事物后面的本质,碰到问题后解决问题思路也发生了改变。举个具体的例子,我在学习数据分析,将来会考虑从事这方面的工作,需要掌握的相关专业知识这个问题暂且按下不表,那哪些具体的问题是我需要了解的呢,以下简单罗列:1、了解数据分析师这个岗位在各个地区的需求情况?2、数据分析师的薪...

  • 这一节将开始学习python的一个核心数据分析支持库---pandas,它是python数据分析实践与实战的必备高级工具。对于使用 Python 进行数据分析来说,pandas 几乎是无人不知,无人不晓的。今天,我们就来认识认识数据分析界鼎鼎大名的 pandas。目录一. pandas主要数据结构 SeriesDataFrame二...

  • 一次手贱更新了上面这个驱动,结果: Fn+F2/F3不能控制亮度win+X弹出来的下面这个窗口“显示器亮度”不见了 电源选项里面底部“屏幕亮度”也不见了 我研究了三天,各种骚操作都试过了,最后找到解决方案: win+R 输入 devmgmt.msc 回车,按照下图操作,瞬间亮度恢复正常 ...

  • 第一种:需要刷新当前页面重复执行的操作——使用场景:刷点击率 、秒杀活动、抢沙发   //自动化循环操作方法 var doLoop = function (dom) {dom || (dom = document);//这里写循环操作的代码dom.querySelector("sel").innerHTML = "舒工的骚操作!!...

  • Ubuntu常用操作外观操作修改应用icon图标终端美化内存管理内存查询分区管理日志清理操作执行自动执行多条命令...

  • 文章目录前言工业级 LRU Cache1. 基本架构2. 基本操作2.1 insert 操作2.2 高并发下 insert 的一致性/性能 保证2.3 Lookup操作2.4 shard 对 cache Lookup 性能的影响2.4 Erase 操作2.5 内存维护3. 优化...

  • 最近利用vim做一些文本处理时 发现vim 支持的键盘宏是一个好东西啊,高效优雅得处理大量需要重复性操作的文本,让人爱不释手!!! 希望接下来对键盘宏的分享能够实际帮助到大家。 后文中描述的一些vim操作会汇集成指令字符串,方便大家参考。 1. 场景描述 在分享键盘宏之前,先看这样一个文本操作需求: 对如下文本增加ma...