在开发中,出于各种原因往往希望数据库中的表可以同步,如果是同一个数据库中的两张表进行同步这个完全不是问题,一个触发器就可以搞定了,如果是两个数据库中的表,甚至是一个局域网或是广域网内的两个数据库同步,触发器是完全派不上用场的。下面也就这个问题说说自己的一些想法。
就拿一个局域网内的一台客户机和一台服务器上的数据库进行同步吧,客户端数据库中表插入,删除,修改同步到服务器上相应的数据库表中。或许这样的问题没有什么实际的意义,现在假设有客户有类似的需求,哈哈,客户是上帝,只有实现了。其实此类问题有两种方法可以解决:
①:借助中间转发实现,建立一个winform用来转发数据,实现的过程就是客户端数据库和UI同步更新,UI获知客户端数据库的变化再作用到服务器上的数据库,这种方法实际就是用winform和数据库的同步更新来完成数据库和数据库的同步更新。
至于winform和数据库的同步更新在之前的随笔中有提到,方法也有好几种,比较推崇的方法是利用触发器将变化的数据发送到UI上,在UI上启动监听,实时监听数据变化然后保存到服务器的数据库上。这种方式的实时性很好,涉及到的知识包括Socket编程,数据库调用DLL(SQL2000和SQL2005在调用DLL上有很大的区别)。可是算是一个技术性比较强的方法,不过却很实用。(具体的一些实现可以参看之前的一些随笔)
②:数据库复制技术,现在重点讲讲这个。
数据库的复制技术同样可以实现局域网内两个不同机器上的数据库同步更新,关于这方面的操作不再可以查看http://life.lifesci.cn/html/gl/2008-11/7767.htm上的介绍,在实现了发布服务器和订阅服务器后,选择发布名称右击弹出属性对话框,选择状态选项卡,可以启动代理程序,同时也可以修改代理程序的属性,修改代理程序属性会弹出一个对话框(好像就是在作业建立的时候定义调度的那个对话框),可以看到调度选项卡,编辑调度,其中有四个选项(1):SQL Server代理启动时自动启动;(2):CPU闲置时启动;(3):一次;(4):反复出现。也就是说更新的最快频率应该是一分钟更新一次,对实时性要求不高的可以采用这种方式实现数据库同步,毕竟不需要任何的代码,只需要几步设置就可以了。
从上面的介绍可不可以说数据库的同步更新不适合对于实时性要求很高的同步更新(或许可以,但是目前还没有研究出来),那这样,是不是可以说SQL中自带的复制技术专门用于定时同步数据库的,利用第一种方式可以弥补这种复制技术。最后,只能说,根据自己的需求选择合适的方式才是最重要的!!