通过作业,定时同步两个数据库

-- 定时同步服务器上的数据 
--
例子:
--
测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
--
服务器上的表(查询分析器连接到服务器上创建)
create   table   [ user ] (id  int   primary   key , number   varchar ( 4 ),name  varchar ( 10 ))
go
-- 以下在局域网(本机操作)
--
本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [user] ' and   OBJECTPROPERTY (id, N ' IsUserTable ' =   1 )
 
drop   table   [ user ]
GO
create   table   [ user ] (id  int   identity ( 1 , 1 ), number   varchar ( 4 ),name  varchar ( 10 ),state  bit )
go
-- 创建触发器,维护state字段的值
create   trigger  t_state  on   [ user ]
after 
update
as
update   [ user ]   set  state = 1
from   [ user ]  a  join  inserted b  on  a.id = b.id
where  a.state  is   not   null
go

-- 为了方便同步处理,创建链接服务器到要同步的服务器
--
这里的远程服务器名为:xz,用户名为:sa,无密码
if   exists ( select   1   from  master..sysservers  where  srvname = ' srv_lnk ' )
 
exec  sp_dropserver  ' srv_lnk ' , ' droplogins '
go
exec  sp_addlinkedserver   ' srv_lnk ' , '' , ' SQLOLEDB ' , ' xz '
exec  sp_addlinkedsrvlogin  ' srv_lnk ' , ' false ' , null , ' sa '
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
-- set  XACT_ABORT on
--
启动远程服务器的MSDTC服务
--
exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /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  srv_lnk.test.dbo. [ user ]
  
where  id  not   in ( select  id  from   [ user ] )

 
-- 同步新增的数据
  insert   into  srv_lnk.test.dbo. [ user ]
 
select  id, number ,name  from   [ user ]   where  state  is   null
 
 
-- 同步修改的数据
  update  srv_lnk.test.dbo. [ user ]   set
  
number = b. number ,name = b.name
 
from  srv_lnk.test.dbo. [ user ]  a
  
join   [ user ]  b  on  a.id = b.id
 
where  b.state = 1
 
 
-- 同步后更新本机的标志
  update   [ user ]   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 ,      -- 每天
  @freq_interval   =   1 ,     -- 每天执行一次
  @active_start_time   =   00000    -- 0点执行
go


本文转载自:http://ghd258.cnblogs.com/archive/2005/10/24/260784.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值