对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 

 

 

 



     本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/787562,如需转载请自行联系原作者

相关文章
|
SQL 存储 监控
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
2376 1
|
关系型数据库 MySQL 数据库
|
SQL
触发器里面before和after的区别
   关键字before和after用于标识触发时间,顾名思义,before代表触发器里面的命令在DML修改数据之前执行,after代表触发器里面的命令在DML修改数据之后执行。
1264 0
|
27天前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
4月前
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
43 0
|
4月前
|
SQL 数据采集 关系型数据库
|
5月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。