`
sjk2013
  • 浏览: 2185795 次
文章分类
社区版块
存档分类
最新评论

如何控制触发器递归

 
阅读更多
背景
AUPDATE后,取B表某列再次UPDATE A表,这样又触发了A表的 UPDATE 触发器,我的目的是只触发一次,是否设置 nested triggers 选项关闭递归触发器即可?
分析
首先,必须清楚触发器递归的定义,触发器有两种递归方式:
1. 直接递归
A表上的触发器更改(插入/删除/更新)A表数据,导致A表的触发器再次触发,这种状况称之为直接递归;
2. 间接递归
A表上的触发器更新B表数据,导致触发B表触发器;而B表触发器又更改A表数据,导致A表触发器再次触发,这种状况称之为间接递归
解决方法选项配置(影响所有范围的触发器)
SQL Server提供了数据库级和服务器级配置来确定递归触发器是否被允许:
1. 服务器级(使用存储过程sp_configure 进行配置)
server trigger recursion 选项(SQL Server 2005)决定是否允许服务器级触发器直接递归激发;当此选项设置为1 (ON,默认值)时,将允许服务器级触发器递归激发;当设置为0 (OFF) 时,服务器级触发器不能递归激发。
nested triggers选项决定是否允许触发器间接递归激发;当此选项设置为1 (ON,默认值)时,将允许触发器递归激发;当设置为0 (OFF) 时,触发器不能递归激发。
2. 数据库级
RECURSIVE_TRIGGERS数据库选项设置决定是否允许数据库中的触发器直接递归触发;默认值为OFF,不允许直接递归触发。
该选项可以通过存储过程sp_dboption设置;对于SQL Server 2005,还可以使用类似下面的T-SQL设置:
ALTER DATABASE [DbName]
SET RECURSIVE_TRIGGERS ON
使用选项决定递归触发器的行为时,需要注意的是选项设置的有效范围:
nested triggers选项决定所有的触发器是否间接递归激发,这意味着这是一个SQL Server实例级的选项,设置将影响所有的触发器。
server trigger recursion选项是SQL Server 2005中才有的(SQL Server 2005才有服务器级触发器)。
RECURSIVE_TRIGGERS选项影响配置它的数据库中的所有触发器。
其他解决方法(针对特定的触发器)
如果只希望特定的触发器允许或者禁止触发器,则SQL Server没有选项可以做到;如果确实需要这样的功能,可以在触发器代码中实现控制:
1. 使用update(列名)函数
此函数适用于对 UPDATE 的控制。对于"AUPDATE 后,取B表某列再次UPDATE A",如果仅更新A表的某些列才触发UPDATE B, 并且B 表再次UPDATE A表不会包含A表触发UPDATE B的那些列,则在A表的触发器中,使用IF UPDATE()来确定是否应该UPDATE B即可。
2. 使用@@NESTLEVEL
该变量值确定嵌套层数。
对于"Aupdate后,取B表某列再次UPDATE A",如果触发者不是一个存储过程, UPDATE A A表触发器@@NESTLEVEL = 1, UPDATE B, B表触发器 @@NESTLEVEL = 2, B表触发器再UPDATE A,@@NESTLEVEL = 3
所以如果 @@NESTLEVEL >=3 , 一般表示递归了(当然, 前提是UPDATE A的触发器本身没有两层的递归, 即不能是存储过程再调用存储过程去UPDATE A
3. 使用 @@PROCID
该全局变量返回调用者的object_id如果需要A表触发B表触发器,而B表触发器再触发A表触发器时,A表触发器不响应;则在A表触发器中使用它来判断触发者是谁,如果是B表触发器,则不处理就行了,类似下面这样
IF OBJECT_ID(N'B表触发器名称') = @@PROCID
BEGIN
PRINT 'B表触发器, 不处理'
RETURN
END
分享到:
评论

相关推荐

    Oraclet中的触发器

     由触发器所调用的过程或函数也不能使用数据库事务控制语句;  触发器中不能使用LONG, LONG RAW 类型;  触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据;  触发器所访问的表受到表...

    精通SQL--结构化查询语言详解

    16.2.8 递归触发器 336 16.2.9 sql server中触发器的管理 338 16.3 oracle数据库中触发器的操作 340 16.3.1 oracle触发器类型 340 16.3.2 触发器的创建 341 16.3.3 创建系统触发器 342 16.3.4 触发器的触发...

    精通sql结构化查询语句

    20.4.2 算术运算符的应用 20.4.3 表达式的应用 20.5 数据维护与触发器的应用 20.5.1 添加数据的实现 20.5.2 更新数据的实现 20.5.3 删除数据的实现 20.5.4 在VB.NET中应用触发器20.6 小结第21章 VB 6.0与SQL Server...

    TriggerX:带有事件和递归控制的 Force.com 的光触发模式

    目录____#用一行代码执行触发器 TriggerX . handleTrigger( AccountSampleHandler . class)触发器通常包含检查更改的字段值的条件逻辑 if ( record . CloseDate != recordOld . CloseDate|| record . OwnerId != ...

    精通SQL 结构化查询语言详解

    16.2.8 递归触发器  16.2.9 SQL Server中触发器的管理  16.3 Oracle数据库中触发器的操作  16.3.1 Oracle触发器类型  16.3.2 触发器的创建 16.3.3 创建系统触发器  16.3.4 触发器的触发次序和触发谓词的...

    SQLServer2000高级编程技术(part02)-想学存储过程 SQL编程 务必要看

    9.3.3 嵌套触发器和递归触发器 9.3.4 触发器的限制 9.3.5 SQL Server 2000中的触发器 9.3.6 管理触发器 9.3.7 设计触发器的建议 9.3.8 触发器中的事务管理 9.3.9 使用触发器 9.4 小结 9.5 练习 第10章 高级存储过程...

    SQLServer2000高级编程技术-已添加书签,想学存储过程、SQL编程务必要看,分析非常透彻

    9.3.3 嵌套触发器和递归触发器 9.3.4 触发器的限制 9.3.5 SQL Server 2000中的触发器 9.3.6 管理触发器 9.3.7 设计触发器的建议 9.3.8 触发器中的事务管理 9.3.9 使用触发器 9.4 小结 9.5 练习 第10章 高级存储过程...

    基于构件框架及模型驱动的操作系统内核 (2005年)

    构件框架按照触发器条件控制构件的执行,解决系统在非功能方面的问题。Pcanel采用一个规范的状态和行为的转换系统,将控制流与构件的执行相分离,并且在规范的递归形式下实现框架的组合。研究结果表明,Pcanel能够...

    SQL Server 2008高级程序设计 5/6

     3.8 递归查询  3.9 合并  3.10 利用外部调用完成复杂操作  3.11 性能考虑  3.12 小结 第4章 XML集成  4.1 XML数据类型  4.2 提取XML格式的关系数据  4.3 有关XML索引的提示  4.4 层次数据概述 ...

    SQL Server 2008高级程序设计 4/6

     3.8 递归查询  3.9 合并  3.10 利用外部调用完成复杂操作  3.11 性能考虑  3.12 小结 第4章 XML集成  4.1 XML数据类型  4.2 提取XML格式的关系数据  4.3 有关XML索引的提示  4.4 层次数据概述 ...

    SQL Server 2008高级程序设计 6/6

     3.8 递归查询  3.9 合并  3.10 利用外部调用完成复杂操作  3.11 性能考虑  3.12 小结 第4章 XML集成  4.1 XML数据类型  4.2 提取XML格式的关系数据  4.3 有关XML索引的提示  4.4 层次数据概述 ...

    SQL Server 2008高级程序设计 1/6

     3.8 递归查询  3.9 合并  3.10 利用外部调用完成复杂操作  3.11 性能考虑  3.12 小结 第4章 XML集成  4.1 XML数据类型  4.2 提取XML格式的关系数据  4.3 有关XML索引的提示  4.4 层次数据概述 ...

    SQL Server 2008高级程序设计 2/6

     3.8 递归查询  3.9 合并  3.10 利用外部调用完成复杂操作  3.11 性能考虑  3.12 小结 第4章 XML集成  4.1 XML数据类型  4.2 提取XML格式的关系数据  4.3 有关XML索引的提示  4.4 层次数据概述 ...

    SQL Server 2008高级程序设计 3/6

     3.8 递归查询  3.9 合并  3.10 利用外部调用完成复杂操作  3.11 性能考虑  3.12 小结 第4章 XML集成  4.1 XML数据类型  4.2 提取XML格式的关系数据  4.3 有关XML索引的提示  4.4 层次数据概述 ...

    Java语言基础下载

    递归(recursive): 240 快速排序: 242 内容总结 245 独立实践 246 第十五章:数据结构与算法(下) 247 学习目标 247 数据结构介绍: 248 数组 248 逻辑大小和物理大小 248 链表 248 栈(stack) 249 队列: 250 树:...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    11.5 控制流语句 11.5.1 IFELSE语句 11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 创建存储过程:基本语法 12.2 使用ALTER...

Global site tag (gtag.js) - Google Analytics