触发器实现两台服务器数据同步

本文探讨了在SQL Server环境中通过触发器实现跨服务器数据同步的问题及解决方案。遇到的主要问题是触发器无法启动分布式事务,最终通过配置DTC服务解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:server 2008系统 SQL SERVER 2008环境, 这个触发器运行了半个多月一直没有问题,前段时间突然触发不过去。MSDTC,SQL 服务均已启动, 135端口开了,防火墙都关掉了。

错误情况:

链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "没有活动事务。"。
消息 7391,级别 16,状态 2,过程 Trigger_ToYuTuWaterWaterInputDayData,第 33 行
无法执行该操作,因为链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务。

触发器:

ALTER TRIGGER [MonitorOperationData].[Trigger_ToYuTuWaterWaterInputDayData]
   ON  [MonitorOperationData].[WaterInputDayData]
   AFTER insert
AS
BEGIN
 SET NOCOUNT ON;
 declare @result int
 exec @result=master..xp_cmdshell'osql -S10.41.3.10 -Usa -Psa',no_output
 if @result=0
 begin
 declare @PSCode varchar(20),@OutPut varchar(20),@inspecttime datetime,@infectantcode varchar(20),@datagathercode varchar(20),@MinFlux numeric(18, 3),@AvgFlux numeric(18, 3),@MaxFlux numeric(18, 3)
 
 declare mycursor cursor for select PSCode,INputCode,MonitorTime,MinFlow,AvgFlow,MaxFlow from inserted
 open mycursor
 fetch next from mycursor into @PSCode,@OutPut,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux
 while @@fetch_status=0
 begin
  
  select @infectantcode=convert(varchar(20),@PSCode)+'_'+convert(varchar(20),@OutPut)
  SET ANSI_NULL_DFLT_ON ON
  SET ANSI_WARNINGS ON
  set xact_abort on
  begin distributed transaction
  insert into openrowset('sqloledb','10.41.3.10';'sa';'sa','select DataGatherCode,InspectTime,MinFlux,AvgFlux,MaxFlux  from db_omgis_ly_null.dbo.T_Bas_DAYOutportData') values(@infectantcode,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux)
    commit tran
  
 fetch next from mycursor into @PSCode,@OutPut,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux
 end
 close mycursor
 deallocate mycursor
end
END

 

有两张表数据要做实时同步,于是做了个触发器进行同步。但是出现: 链接服务器"192.168.99.66"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。无法执行该操作,因为链接服务器 "192.168.99.66" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。

 

由于是两个表在不同的数据库,并且数据库在不同的网段。

 

排查:

1、发现由于防火墙限制,无法访问对方135端口。开放后还是不行。

2、修改host文件,将对方机器名和IP加入。问题解决。

 

 触发器如下

ALTER TRIGGER [syncuser]
ON [dbo].[User] 
AFTER INSERT
AS
BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

 set    xact_abort   on   
 begin  distributed   tran  
     insert   into   openrowset('SQLOLEDB' , '192.168.0.86' ; 'sa' ; 'sa' , tr55_bk.dbo.user)    
     select   *   from   tr55.dbo.trafaxuser       
 commit tran
END;

 

谢谢大家 问题已经解决 ap0405140 之外的提供解决方案的朋友 说的都有道理,但是 这个问题的根本原因是 DTC 服务 需要安全配置。配置完成最初的语句就可以使用。 谢谢大家

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值