您的位置:首页 > 数据库

避免SQL Server 触发器死循环

2008-03-12 10:47 731 查看
避免SQL Server 触发器死循环

标签:
sql server数据库存储sql

2008-03-12 10:47
3354人阅读 评论(1)
收藏
举报

本文章已收录于:


分类:
数据库(28)




作者同类文章X

版权声明:本文为博主原创文章,转载请注明出处。

        在使用SQL Server时,有时候希望针对数据表中某一字段的修改执行一段触发器代码,比如修改了人员名称时,我们希望数据库会自动执行一代码来修改同一数据表中的姓名拼音首字母字段。如果使用After Update触发器则会让SQL Server崩溃掉,那么有什么办法可以避免这种死循环吗?答案是肯定的,我可以在触发器中判断用户是否修改了姓名字段,如果是则执行后续更新代码,如果用户修改了其他字段,则不执行任何代码。 
        假设有一张表存储客户的信息,第一个字段是Visitor_ID,第二个字段Visitor_Name,第三个字段是Visitor_PY_Code。我们针对新增和更新动作写两个触发器。
        针对新增的触发器很容易写,现在的问题是在更新的触发器,如果再使用Update语句就会循环执行触发器了,系统会崩溃掉的。我们希望只针对单一字段的更新执行触发器。还好SQL提供了COLUMNS_UPDATED()函数,能够判断出哪一字段被更新。于是将更新的触发器写成如下:


CREATE TRIGGER [UpdatePYCodeOnly] ON [dbo].[Visitor] 


FOR UPDATE


AS


IF (COLUMNS_UPDATED() & 2) = 2 BEGIN


declare


  @VisitorID int,


  @NameStr nvarchar(50)


  Select @VisitorID = Visitor_ID, @NameStr = Visitor_Name From Inserted


  Update Visitor Set NamePINYIN = dbo.GetPYCode(@NameStr) Where Visitor_ID = @VisitorID


END



        在使用COLUMNS_UPDATED()函数需要注意以下几点

表中第一个字段序号为0,第二个字段序号为1,依此类推
表中的字段顺序不要改动

2008-04-10 15:07发表
[回复] [引用]

[举报]



if update(fieldname) ......

就可以了,这样就不怕字段顺序改变
 



顶0踩0
上一篇关系代数五种基本操作和四程组合操作
下一篇IBM Windows Key
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: