T_TEST20070628表与T_XW表结构比较类似,都有zbbh(char(10)),yybbh(int),hth(char(10)),由于某周原因,两个表之间没有建立关系,需要用触发器实现两表数据同步,hth是不会被更新的(最关键的字,无论程序还是分析器里面,管理员都不会这样去更新).
目的:如果T_TEST20070628里面的字段ZBBH,yybbh被更新,则对应更新T_XW.CREATE TRIGGER tg_T_TEST20070628_update ON dbo.T_TEST20070628
FOR UPDATE 
AS
    if (UPDATE(ZBBH) and not UPDATE(YYBBH))
  begin
    update t_xw set zbbh=i.zbbh,xgrdm=i.xgrdm,xgrq=getdate() from   inserted as i where  t_xw.hth=i.hth
  end
    if UPDATE(YYBBH)
  begin
            update t_xw set zbbh=i.zbbh,yybbh=i.yybbh,xgrdm=i.xgrdm,xgrq=getdate() from   inserted as i where  t_xw.hth=i.hth
  end
         
END
这个代码是我在前人基础上修改的,但我觉得if条件好象有问题,而我自己不是很理解条件括号里面的含义,所以请大家给我解释一下,并诊断一下是不是会出错.

解决方案 »

  1.   

    if (UPDATE(ZBBH) and not UPDATE(YYBBH))
    如果修改了ZBBH而且没修改YYBBHif UPDATE(YYBBH)
    如果修改了YYBBH似乎没有问题,但是如果只是修改了xgrdm字段,这个触发器并不同步两个表的xgrdm
      

  2.   

    if (UPDATE(ZBBH) and not UPDATE(YYBBH))
    如果修改了ZBBH而且没修改YYBBHif UPDATE(YYBBH)
    如果修改了YYBBH
     这个update(***)是指update操作里面只要有更新***还是指象游标一样对inserted的内容循环,对更新的每个记录判断?
      

  3.   

    比如在查询分析器里面同时执行下面两句,那么触发器如何工作?
    update t_test set yybbh=2 where hth like '%sx%'--会有很多记录被更新
    update t_test set zbbh='2' where hth like '%sx%'--会有很多记录被更新
      

  4.   

    这个update(***)是指update操作里面只要有更新***还是指象游标一样对inserted的内容循环,对更新的每个记录判断?是指update操作里面只要有更新***,他不管实际字段是否改变,比如
    update tablename set ZBBH=ZBBH where ....
    这样的语句,实际什么也没改变,但是触发器的
    update(ZBBH)还是返回true
      

  5.   

    update t_test set yybbh=2 where hth like '%sx%'--会有很多记录被更新触发器执行
      update t_xw set zbbh=i.zbbh,yybbh=i.yybbh,xgrdm=i.xgrdm,xgrq=getdate() from   inserted as i where  t_xw.hth=i.hth
    update t_test set zbbh='2' where hth like '%sx%'--会有很多记录被更新触发器执行
    update t_xw set zbbh=i.zbbh,xgrdm=i.xgrdm,xgrq=getdate() from   inserted as i where  t_xw.hth=i.hth
      

  6.   

    我还有一个疑问:
    inserted ,updated两个表是不是一定是完全对应的?比如某表table 被执行了update后,两个表里面的记录一定能通过inner join一一对应连接起来?!
      

  7.   


    这个update(***)是指update操作里面只要有更新***还是指象游标一样对inserted的内容循环,对更新的每个记录判断?
    -----------------------------------------------------------------------------------
    是指update操作里面只要有更新***,他不管实际字段是否改变,比如
    update tablename set ZBBH=ZBBH where ....
    这样的语句,实际什么也没改变,但是触发器的
    update(ZBBH)还是返回true
    -----------------------------------------
    根据 Haiwer(海阔天空) 的提示,看样子为了比较准确,非常有必要在这个触发器里面使用游标啊,对inserted 表中的每条记录进行判断,如果执行了更新且zbbh,yybbh值发生了改变,就执行和另外一个表的同步更新?
    恳请高手指点
    谢谢
      

  8.   

    才发现没结贴,来告诉一下大家结果.
    1.根据上面叙述,update触发器不论update操作是否真正改变了zbbh,yybbh字段的值,触发器里面更新t_xw表的语句都会被启用.故我作了修改,就是在更新t_xw的语句前对if条件进行完善,如果update操作真正改变了值才进行后续操作.
    2.同时如果是在查询分析器中执行了批性质的 update更新操作,那么inserted,deleted表中(记不清是否这两个表分别存储将要插入的记录和将要删除的记录了)中决不只一条记录,这个时候原触发器中会造成只对inserted中的最后一条(第一条?)进行操作.所以将触发器修改成使用游标,对inserted,deleted中循环去更新t_xw.
    具体的代码我不记得了.下次找到了co p y 过来.大家明白我上面的描述吗,同时我这个解决方法是否还有bug?