对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,如需转载请自行联系原作者

相关文章
|
9月前
|
SQL 存储 监控
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
1234 1
|
关系型数据库 MySQL 数据库
|
SQL
触发器里面before和after的区别
   关键字before和after用于标识触发时间,顾名思义,before代表触发器里面的命令在DML修改数据之前执行,after代表触发器里面的命令在DML修改数据之后执行。
1188 0
|
1月前
|
关系型数据库 MySQL
Mysql基础第二十八天,使用触发器
Mysql基础第二十八天,使用触发器
28 0
Mysql基础第二十八天,使用触发器
|
7月前
|
存储 SQL 关系型数据库
MySQL存储过程和触发器
MySQL存储过程和触发器
81 0
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】10、MySQL 的触发器
【MySQL 数据库】10、MySQL 的触发器
20 0
|
2月前
|
SQL 存储 关系型数据库
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
37 0
|
7月前
|
存储 关系型数据库 MySQL
使用MySQL视图与触发器
使用MySQL视图与触发器。
41 4
|
7月前
|
关系型数据库 MySQL 数据库
记录一下mysql触发器的一个小知识点
记录一下mysql触发器的一个小知识点
记录一下mysql触发器的一个小知识点