我写的update触发器,似乎还有问题

时间:2022-06-25 11:01:24
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条件好象有问题,而我自己不是很理解条件括号里面的含义,所以请大家给我解释一下,并诊断一下是不是会出错.

8 个解决方案

#1


if (UPDATE(ZBBH) and not UPDATE(YYBBH))
如果修改了ZBBH而且没修改YYBBH

if UPDATE(YYBBH)
如果修改了YYBBH

似乎没有问题,但是如果只是修改了xgrdm字段,这个触发器并不同步两个表的xgrdm


#2


if (UPDATE(ZBBH) and not UPDATE(YYBBH))
如果修改了ZBBH而且没修改YYBBH

if 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?

#1


if (UPDATE(ZBBH) and not UPDATE(YYBBH))
如果修改了ZBBH而且没修改YYBBH

if UPDATE(YYBBH)
如果修改了YYBBH

似乎没有问题,但是如果只是修改了xgrdm字段,这个触发器并不同步两个表的xgrdm


#2


if (UPDATE(ZBBH) and not UPDATE(YYBBH))
如果修改了ZBBH而且没修改YYBBH

if 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?