ImageVerifierCode 换一换
格式:DOC , 页数:2 ,大小:17KB ,
资源ID:1530541      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-1530541.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(如何控制触发器递归.doc)为本站会员(cjc2202537)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

如何控制触发器递归.doc

1、如何控制触发器递归 A 表 UPDATE 后,取 B 表某列再次 UPDATE A 表,这样又触发了 A 表的 UPDATE 触发器,我的目的是只触发一次,是否设置 nested triggers 选项关闭递归触发器即可?分析首先,必须清楚触发器递归的定义,触发器有两种递归方式:1 直接递归A 表上的触发器更改(插入/删除/更新)A 表数据,导致 A 表的触发器再次触发,这种状况称之为直接递归;2 间接递归A 表上的触发器更新 B 表数据,导致触发 B 表触发器;而 B 表触发器又更改 A 表数据,导致 A 表触发器再次触发,这种状况称之为间接递归解决方法选项配置(影响所有范围的触发器)SQL

2、 Server 提供了数据库级和服务器级配置来确定递归触发器是否被允许:1. 服务器级(使用存储过程 sp_configure 进行配置)server trigger recursion 选项(SQL Server 2005)决定是否允许服务器级触发器直接递归激发;当此选项设置为 1 (ON,默认值)时,将允许服务器级触发器递归激发;当设置为0 (OFF) 时,服务器级触发器不能递归激发。nested triggers 选项决定是否允许触发器间接递归激发;当此选项设置为 1 (ON,默认值) 时,将允许触发器递归激发;当设置为 0 (OFF) 时,触发器不能递归激发。2. 数据库级RECURS

3、IVE_TRIGGERS 数据库选项设置决定是否允许数据库中的触发器直接递归触发;默认值为 OFF,不允许直接递归触发。该选项可以通过存储过程 sp_dboption 设置;对于 SQL Server 2005,还可以使用类似下面的 T-SQL 设置:ALTER DATABASE DbNameSET RECURSIVE_TRIGGERS ON使用选项决定递归触发器的行为时,需要注意的是选项设置的有效范围:nested triggers 选项决定所有的触发器是否间接递归激发,这意味着这是一个 SQL Server 实例级的选项,设置将影响所有的触发器。server trigger recursi

4、on 选项是 SQL Server 2005 中才有的( SQL Server 2005 才有服务器级触发器)。RECURSIVE_TRIGGERS 选项影响配置它的数据库中的所有触发器。其他解决方法(针对特定的触发器)如果只希望特定的触发器允许或者禁止触发器,则 SQL Server 没有选项可以做到;如果确实需要这样的功能,可以在触发器代码中实现控制:1 使用 update(列名)函数此函数适用于对 UPDATE 的控制。对于“A 表 UPDATE 后,取 B 表某列再次 UPDATE A 表“,如果仅更新 A 表的某些列才触发 UPDATE B, 并且 B 表再次 UPDATE A 表不

5、会包含A 表触发 UPDATE B 的那些列 ,则在 A 表的触发器中,使用 IF UPDATE(列)来确定是否应该UPDATE B 即可。2 使用 NESTLEVEL该变量值确定嵌套层数。对于“A 表 update 后,取 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(NB 表触发器名称 ) = PROCIDBEGINPRINT B 表触发器, 不处理RETURNEND

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报