(转)关于SQL SERVER数据同步自己的一些设计经验
原文地址:
不过这个项目已经过去N天但是数据同步部分起初是我的一些设计思想。这个项目是某电力公司的一卡通项目,这个项目将来需要在全国20几个分厂都要做。
按照项目的要求基础数据在总部存储,然后同步到各个分厂。里面一些详细的需求不详说了。直接进入正题。
同步方式:数据库之间的同步,不再做程序上的干涉了。
实现步骤:
1、总部的表建立触发器,来记录对表的增、删、改的动作,将动作记录到一张中间表中(中间表需要加一个同步标记的字段来表示数据是否已经被同步过)
CREATE trigger [TG_JC_ZZJG] on [dbo].[JC_ZZJG]
for insert,delete,update
as
begin
-- 插入 1
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
begin
INSERT INTO T_JC_ZZJG
(CZLX,BH,MC,QMC,SJBH,LXR,LXDH,LXDZ,BZ,GSBJ,GSBH)
select 1,i.BH,i.MC,i.QMC,i.SJBH,i.LXR,i.LXDH,i.LXDZ,i.BZ,i.GSBJ,i.GSBH
from inserted i
end
-- 更新 2
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
begin
INSERT INTO T_JC_ZZJG
(CZLX,BH,MC,QMC,SJBH,LXR,LXDH,LXDZ,BZ,GSBJ,GSBH)
select 2,u.BH,u.MC,u.QMC,u.SJBH,u.LXR,u.LXDH,u.LXDZ,u.BZ,u.GSBJ,u.GSBH
from inserted u
end
-- 删除 3
IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
begin
INSERT INTO T_JC_ZZJG
(CZLX,BH,GSBH)
select 3,d.BH,D.GSBH
from deleted d
end
end
2、分厂建立远程连接
//添加远程连接
EXEC sp_addlinkedserver @server = 'ZBEZCAS',@srvproduct='',@provider = 'SQLOLEDB',@provstr = 'DRIVER={SQL Server};SERVER='127.0.0.1';UID='sa';PWD='sa';
//设置连接连接的登录名
EXEC sp_addlinkedsrvlogin 'ZBEZCAS','false',NULL,'sa','sa'
3、分厂建立同义词,来简化访问表(这步只是简化操作,没有别的太大意思)
CREATE SYNONYM T_JC_ZZJG FOR ZBEZCAS.EZCAS.DBO.T_JC_ZZJG
4、分厂执行同步数据,完毕后回写同步标记为“已同步”
具体的同步方法使用的是存储过程,直接同步T_JC_ZZJG (被简化后的远程表)表中没有被同步的数据即可,同步完回写同步标记。