觸發器實現兩臺服務器數據同步

說明: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 服務 需要安全配置。配置完成最初的語句就可以使用。 謝謝大家

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章