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条件好象有问题,而我自己不是很理解条件括号里面的含义,所以请大家给我解释一下,并诊断一下是不是会出错.
目的:如果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条件好象有问题,而我自己不是很理解条件括号里面的含义,所以请大家给我解释一下,并诊断一下是不是会出错.
解决方案 »
- 通过sql语句或存储过程怎样获取这样的结果?(在线等)
- sql可以实现迭代吗?
- sql 嵌套统计性能问题。求高手解答 急!急急急急急!!
- 怎样查出这样的数据??、有点难度,想了好久,没好的思路..
- 求sql存储过程
- 求同一行中的一个字段计算返回多条记录
- 问一个database design 的简单的问题
- 谁能帮我解决这个问题
- 寻求sql视图更多的参考资料
- WIN98上的SQL Server能注册NT服务器的上SQL Server,而NT服务器的上SQL Server却不能注册WIN98上的SQL Server?
- 事务与select读取问题,请指教!急
- 文本数据库schema.ini中能不能为每一个字段指定格式?
如果修改了ZBBH而且没修改YYBBHif UPDATE(YYBBH)
如果修改了YYBBH似乎没有问题,但是如果只是修改了xgrdm字段,这个触发器并不同步两个表的xgrdm
如果修改了ZBBH而且没修改YYBBHif UPDATE(YYBBH)
如果修改了YYBBH
这个update(***)是指update操作里面只要有更新***还是指象游标一样对inserted的内容循环,对更新的每个记录判断?
update t_test set yybbh=2 where hth like '%sx%'--会有很多记录被更新
update t_test set zbbh='2' where hth like '%sx%'--会有很多记录被更新
update tablename set ZBBH=ZBBH where ....
这样的语句,实际什么也没改变,但是触发器的
update(ZBBH)还是返回true
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
inserted ,updated两个表是不是一定是完全对应的?比如某表table 被执行了update后,两个表里面的记录一定能通过inner join一一对应连接起来?!
这个update(***)是指update操作里面只要有更新***还是指象游标一样对inserted的内容循环,对更新的每个记录判断?
-----------------------------------------------------------------------------------
是指update操作里面只要有更新***,他不管实际字段是否改变,比如
update tablename set ZBBH=ZBBH where ....
这样的语句,实际什么也没改变,但是触发器的
update(ZBBH)还是返回true
-----------------------------------------
根据 Haiwer(海阔天空) 的提示,看样子为了比较准确,非常有必要在这个触发器里面使用游标啊,对inserted 表中的每条记录进行判断,如果执行了更新且zbbh,yybbh值发生了改变,就执行和另外一个表的同步更新?
恳请高手指点
谢谢
1.根据上面叙述,update触发器不论update操作是否真正改变了zbbh,yybbh字段的值,触发器里面更新t_xw表的语句都会被启用.故我作了修改,就是在更新t_xw的语句前对if条件进行完善,如果update操作真正改变了值才进行后续操作.
2.同时如果是在查询分析器中执行了批性质的 update更新操作,那么inserted,deleted表中(记不清是否这两个表分别存储将要插入的记录和将要删除的记录了)中决不只一条记录,这个时候原触发器中会造成只对inserted中的最后一条(第一条?)进行操作.所以将触发器修改成使用游标,对inserted,deleted中循环去更新t_xw.
具体的代码我不记得了.下次找到了co p y 过来.大家明白我上面的描述吗,同时我这个解决方法是否还有bug?