读书人

用触发器让sqlserver跟mysql同步

发布时间: 2013-10-11 14:52:39 作者: rapoo

用触发器让sqlserver和mysql同步

任务:sqlsever中有表A,MySql中有表B。表A和表B结构一样但不在同一台机器上。要求实现当A中的数据有增删改操作时,在B中进行同样的操作。

方案一(已实现):每天定时删除B表再把A表全部复制到A表,http://blog.csdn.net/bailin0007/article/details/11815177。这个方案,不论从效率和用户体验上讲都很糟糕,因为数据量比较大有16W左右,但每天改变的就1k条左右。

方案二: 触发器+程序代码。 思路:在A表上建触发器,把A变中改变(增加,修改)的数据保存在一张中间表C中。然后用C表去更新B表,没有的数据加入,已存在的数据则修改。当A表中删除数据时,将删除的数据保存在中间表D中,通过主键的唯一,用D表中数据去删除B表中的数据。

sql代码如下

[sql] view plaincopy
  1. --查看触发器
  2. select * from sysobjects where xtype='TR'
  3. --------------------------------------
  4. --新增数据触发器
  5. if object_id('tr_insert','tr')is not null
  6. drop trigger tr_insert
  7. go
  8. create trigger tr_insert
  9. on dc_member
  10. for insert
  11. as
  12. begin
  13. -- 插入新数据触发
  14. if(object_id('temp_table','U') is not null) --如果中间表存在
  15. insert into temp_table select * from inserted
  16. else
  17. select * into temp_table from inserted
  18. end
  19. -----------------------------------------
  20. --修改数据的触发器
  21. if object_id('tr_update','tr')is not null
  22. drop trigger tr_update
  23. go
  24. create trigger tr_update
  25. on dc_member
  26. for update
  27. as
  28. begin
  29. -- 修改新数据触发
  30. if(object_id('temp_table','U') is not null)
  31. -- insert into temp_table select * from inserted
  32. update temp_table
  33. set names=i.names,sex=i.sex,telephone=i.telephone,address1=i.address1,
  34. pmdate=i.pmdate,expiry=i.expiry,levels=i.levels,dbno=i.dbno,hispoints=i.hispoints,
  35. bnpoints=i.bnpoints,kypoints=i.kypoints,wxno=i.wxno,remark=i.remark
  36. from inserted i, temp_table tt
  37. where tt.pmcode=i.pmcode
  38. else
  39. select * into temp_table from inserted
  40. end
  41. -----------------------------------------
  42. --删除数据的触发器
  43. if object_id('tr_del','tr')is not null
  44. drop trigger tr_del
  45. go
  46. create trigger tr_del
  47. on dc_member
  48. for delete
  49. as
  50. begin
  51. -- 删除新数据触发
  52. if(object_id('temp_table_del','U') is not null)
  53. insert into temp_table_del select * from deleted
  54. else
  55. select * into temp_table_del from deleted
  56. end

问题:以前处理大量数据是分段+多线程,现在处理这个有必要用多线程吗?用多线程会出现什么问题?....先把问题解决了再说

处理该业务的java代码如下:.....待续




方案三: 寻找成熟的数据库同步技术

读书人网 >Mysql

热点推荐