Chris Mao的专栏

思想比知识更重要,成长比成功更重要

用户操作
[即时聊天] [发私信] [加为好友]
毛子兵ID:chris_mao
15243次访问,排名8082(-2),好友15人,关注者35人。
具有多年的软件研发工作经验
chris_mao的文章
原创 58 篇
翻译 0 篇
转载 6 篇
评论 16 篇
毛子兵的公告
  • 2000年编写第一套商业软件
  • 2001年获得中级程序员认证
  • 2002年从事HIS系统开发
  • 2004年从事ERP软件研发
  • 2005年从事Protel增值开发
  • 2007年从事企业内部门户及网络应用开发
最近评论
zgjzkj:了解了
mghueh:wow power leveling
lee576:if update(fieldname) ......

就可以了,这样就不怕字段顺序改变
hFamily:很棒的文章,不知道可以不可以发到 CodeIgniter 中国开发者社区里呢?
lxy218:恩,是的
同意楼主观点

思想嘛,每个人的理解都是不一样的
所以达到重用易于维护就可以了
文章分类
收藏
    相册
    自然之美
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 避免SQL Server 触发器死循环收藏

    新一篇: IBM Windows Key | 旧一篇: 关系代数五种基本操作和四程组合操作

            在使用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(@NameStrWhere Visitor_ID = @VisitorID
    END

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

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

     

    发表于 @ 2008年03月12日 10:47:00|评论(loading...)|编辑

    新一篇: IBM Windows Key | 旧一篇: 关系代数五种基本操作和四程组合操作

    评论

    #lee576 发表于2008-04-10 15:07:55  IP: 58.49.52.*
    if update(fieldname) ......

    就可以了,这样就不怕字段顺序改变
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 毛子兵