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