您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  531199185
有事点击这里…  61352289
点击这里给我发消息  81721488
有事点击这里…  376585780
有事点击这里…  872642803
有事点击这里…  459248018
有事点击这里…  61352288
有事点击这里…  380791050
技术支持
有事点击这里…  714236853
有事点击这里…  719304487
有事点击这里…  1208894568
有事点击这里…  61352289
在线客服
有事点击这里…  531199185
有事点击这里…  61352288
有事点击这里…  983054746
有事点击这里…  893984210
当前位置:首页 >> 技术文章 >> 文章浏览
技术文章

两台SQL Server服务器同步问题

添加时间:2014-10-7 20:31:53  添加: 思海网络 
-定时同步服务器上的数据(服务器上的数据修改同步到本地)  

--例子:  
--测试环境,SQL Server2000,远程服务器名:rserver,用户名为:ruser,密码:rpwd,  
测试数据库:test  

--服务器上的表(查询分析器连接到服务器上创建)  
--state字段为辅助更新而设置的附加字段,字段值说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录  
if exists (select * from dbo.sysobjects where id = object_id(N’[luser]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)  
drop table [luser]  
GO  
create table [luser](id int identity(1,1) primary key,[user] varchar(4),pwd varchar(10),address varchar(50),state bit)  
go  

--创建触发器,维护state字段的值  
create trigger t_state on [luser]  
after update  
as  
update [luser] set state=1  
from [luser] a join inserted b on a.id=b.id  
where a.state is not null  
go  

----以下在局域网(本机操作)  
if exists (select * from dbo.sysobjects where id = object_id(N’[luser]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)  
drop table [luser]  
create table [luser](id int primary key,[user] varchar(4),pwd varchar(10),address varchar(50))  
go  

--为了方便同步处理,创建链接服务器到要同步的服务器  
--这里的远程服务器名:rserver,用户名为:ruser,密码:rpwd  
if exists(select 1 from master..sysservers where srvname=’srv_lnk’)  
exec sp_dropserver ’srv_lnk’,’droplogins’  
go  
exec sp_addlinkedserver ’srv_lnk’,’’,’SQLOLEDB’,’rserver’  
exec sp_addlinkedsrvlogin ’srv_lnk’,’false’,null,’ruser’,’rpwd’  
go  

--创建同步处理的存储过程  
if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_synchro]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)  
drop procedure [dbo].[p_synchro]  
GO  
create proc p_synchro  
as  
/*--因为MSDTC服务(分布式事务处理需要)工作不稳定,所以下面部分为选用内容  
--set XACT_ABORT on  
--启动远程服务器的MSDTC服务  
--exec master..xp_cmdshell ’isql /S"rserver" /U"ruser" /P"rpwd" /q"exec master..xp_cmdshell ’’net start msdtc’’,no_output"’,no_output  

--启动本机的MSDTC服务  
--exec master..xp_cmdshell ’net start msdtc’,no_output  

--进行分布事务处理,如果表用标识列做主键,用下面的方法  
--BEGIN DISTRIBUTED TRANSACTION  
--*/  
--同步删除的数据  
delete from [luser]  
where id not in(select id from srv_lnk.test.dbo.[luser])  

--同步新增的数据  
insert into [luser]  
select id,[user],pwd,address from srv_lnk.test.dbo.[luser]  
where state is null  

--同步修改的数据  
update [luser] set  
[user]=b.[user],pwd=b.pwd,address=b.address  
from [luser] a  
join srv_lnk.test.dbo.[user] b on a.id=b.id  
where b.state=1  

--同步后更新服务器上的标志  
update srv_lnk.test.dbo.[luser] set state=0 where isnull(state,1)=1  
--COMMIT TRAN --如果启用分布式事务处理,加上此句  
go  

--创建作业,定时执行数据同步的存储过程  
if exists(SELECT 1 from msdb..sysjobs where name=’数据处理’)  
EXECUTE msdb.dbo.sp_delete_job @job_name=’数据处理’  
exec msdb..sp_add_job @job_name=’数据处理’  

--创建作业步骤  
declare @sql varchar(800),@dbname varchar(250)  
select @sql=’exec p_synchro’ --数据处理的命令  
,@dbname=db_name() --执行数据处理的数据库名  

exec msdb..sp_add_jobstep @job_name=’数据处理’,  
@step_name = ’数据同步’,  
@subsystem = ’TSQL’,  
@database_name=@dbname,  

   @command = @sql,  
@retry_attempts = 5, --重试次数  
@retry_interval = 5 --重试间隔  

--创建调度  
EXEC msdb..sp_add_jobschedule @job_name = ’数据处理’,  
@name = ’时间安排’,  
@freq_type=4, --4 每天,8 每周,16 每月  
@freq_interval=1, --作业执行的天数  
@freq_subday_type=0, --是否重复执行,0x1 在指定的时间, 0x4 分钟, 0x8 小时  
@freq_subday_interval=1, --重复周期  
@freq_recurrence_factor=0, --重复执行,则设置为1,否则设置为0  
@active_start_time = 00000 --0点开始执行  

--添加目标服务器  
EXEC msdb.dbo.sp_add_jobserver  
@job_name = @jobname ,  
@server_name = N’(local)’  
go  

也可以直接建立一个数据库的复制。  

即,出版服务器和订阅服务器。  

关键字:服务器、SQL Server、数据库

分享到:

顶部 】 【 关闭
版权所有:佛山思海电脑网络有限公司 ©1998-2024 All Rights Reserved.
联系电话:(0757)22630313、22633833
中华人民共和国增值电信业务经营许可证: 粤B1.B2-20030321 备案号:粤B2-20030321-1
网站公安备案编号:44060602000007 交互式栏目专项备案编号:200303DD003  
察察 工商 网安 举报有奖  警警  手机打开网站