通过链接服务器的触发器同步数据出现如下问题 ,求牛人指点

xuexiaodong2009
博客专家认证
2013-04-16 04:40:34
操作体统windows2003 包含SQL2005 数据库 qixiang 有表QX_MsgMediumSmallScaleTemp

操作体统windows2008 包含SQL2008 数据库shuiwen2有表st_pptn_r
两台电脑在同一局域网内
现在需要把QX_MsgMediumSmallScaleTemp中的数据同步到表st_pptn_r中
首先建立链接服务器,在表QX_MsgMediumSmallScaleTemp上建立触发器同步数据,但出现如下错误
具体建立链接服务器的SQL如下


--创建远程同步连接
IF not exists(select 1 from master.dbo.sysservers where srvname = 'shangluoqixiang')
BEGIN

EXEC sp_addlinkedserver 'shangluoqixiang', ' ', 'SQLOLEDB', '127.0.0.1'--这一行需要根据实际情况修改 IP
EXEC sp_addlinkedsrvlogin 'shangluoqixiang', 'false',null, 'sa', 'password'--这一行需要根据实际情况修改 密码
print ' 数据库远程联接创建成功!';
END
ELSE
exec sp_dropserver 'shangluoqixiang', 'droplogins'
EXEC sp_addlinkedserver 'shangluoqixiang', ' ', 'SQLOLEDB', '127.0.0.1'--这一行需要根据实际情况修改 IP
EXEC sp_addlinkedsrvlogin 'shangluoqixiang', 'false',null, 'sa', 'password' --这一行需要根据实际情况修改 密码
print '数据库远程联接创建成功!';
GO

插入的触发器脚本如下

create TRIGGER [dbo].[trigger_MsgMediumSmallScale_insert]
on [dbo].[QX_MsgMediumSmallScaleTemp]
--on MsgMediumSmallScale
FOR INSERT
AS
--在事务开始前加入set xact_abort ON语句
SET XACT_ABORT ON
--定义变量
DECLARE @stcd varchar(8);
DECLARE @rain int,@stid int;
DECLARE @DateChar datetime,@tm datetime;
DECLARE @TimeChar nchar(4)
DECLARE @hour int
set @stid=1;--这一行需要根据实际情况修改 没有确定

DECLARE @countNo int;

--INSERT trigger
select @countNo =count(StationID) from inserted;
print @countNo +'2244'
if(@countNo=1)
begin
SELECT @stcd=StationID, @DateChar=DateChar , @TimeChar=TimeChar, @rain =Rain from inserted;
-- set @hour=CONVERT(int, @TimeChar,2)
-- set @tm =dateadd(hh,CONVERT(int, @TimeChar,2),@DateChar)
set @tm =@DateChar

INSERT INTO shangluoqixiang.[shanyang].[dbo].[st_pptn_r]([stid] ,[tm] ,[intv],[pdr],[dyp],[drp],[wth],[stcd])
VALUES
(1,'2013-04-15',1 ,null,1,null ,null ,'88')

end


关键是,在qixiang 中直接执行可以,但在触发器中执行出错
iNSERT INTO shangluoqixiang.[shanyang].[dbo].[st_pptn_r]([stid] ,[tm] ,[intv],[pdr],[dyp],[drp],[wth],[stcd])
VALUES
(1,'2013-04-15',1 ,null,1,null ,null ,'88')
错误如下
链接服务器"shangluoqixiang"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。
消息 7391,级别 16,状态 2,过程 trigger_MsgMediumSmallScale_insert,第 28 行
无法执行该操作,因为链接服务器 "shangluoqixiang" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。

一下方法都是了,不起作用,求牛人指点

http://blog.csdn.net/xyj052/article/details/8110672
'SQLOLEDB' 无法启动分布式事务--触发器
http://kms.lenovots.com/kb/article.php?id=3011

2007-01-12 10:13 SQLOLEDB,无法启动分布式服务的疑惑
http://hi.baidu.com/2discovers/item/2f293d18cd384616e2f986e2

MSDTC设置
打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“我的电脑”上点击右键。在MSDTC选项卡中,点击“安全配置”按钮。
在安全配置窗口中做如下设置:
l选中“网络DTC访问”
l在客户端管理中选中“允许远程客户端”“允许远程管理”
l在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”
l保证DTC登陆账户为:NT Authority\NetworkService
从远程服务器数据库中同步数据到本地数据库 sql server 2008 开启分布式事务
http://www.cnblogs.com/yourancao520/archive/2012/02/28/2371231.html
链接服务器,访问接口 "SQLNCLI" 无法启动分布式事务
http://bbs.csdn.net/topics/340208724
...全文
445 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶子 2013-04-17
  • 打赏
  • 举报
回复
真的不建议在触发器里面操作远程数据。
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
补充下,链接使用的是IP,端口的方式
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
问题解决了,即使是局域网同一网段,链接使用IP,也应该配置HOSTS 文件 都必须 配置
haitao 2013-04-17
  • 打赏
  • 举报
回复
插入的触发器 只插入到本地的一个待同步记录表 远程服务器定时访问这个表以同步到自己的表
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
DTCping log file: C:\Documents and Settings\Administrator\桌面\test\CENTN-NONGYE39RPC server is ready Please Start Partner DTCping before pinging ++++++++++++Validating Remote Computer Name++++++++++++ Please refer to following log file for details: C:\Documents and Settings\Administrator\桌面\test\CENTN-NONGYE3936.log Invoking RPC method on centn-dev RPC test is successful ++++++++++++RPC test completed+++++++++++++++ Please start PING from centn-dev to complete the test
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
引用 11 楼 SmithLiu328 的回复:
两台机器的DTC都配置了吗?另外你可以用DTCPing工具测试一下,有错误发上来。
DTCping log file: C:\Documents and Settings\softteam\桌面\dc\CENTN-DEV3484.log RPC server is ready Please Start Partner DTCping before pinging ++++++++++++Validating Remote Computer Name++++++++++++ Please refer to following log file for details: C:\Documents and Settings\softteam\桌面\dc\CENTN-DEV3484.log Invoking RPC method on centn-nongye Problem:fail to invoke remote RPC method Error(0x6D9) at dtcping.cpp @303 -->RPC pinging exception -->1753(终结点映射器中没有更多的终结点可用。) RPC test failed
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
引用 22 楼 ap0405140 的回复:
引用 20 楼 xuexiaodong2009 的回复: 引用 17 楼 ap0405140 的回复:试试把触发器代码里的: SET XACT_ABORT ON 这句删掉后再试呢.这样也不行 LZ可私信找我喔,远程帮你看看..
只有相互关注才能发私信啊,你也关注下我就可以发了
唐诗三百首 2013-04-17
  • 打赏
  • 举报
回复
引用 20 楼 xuexiaodong2009 的回复:
引用 17 楼 ap0405140 的回复:试试把触发器代码里的: SET XACT_ABORT ON 这句删掉后再试呢.这样也不行
LZ可私信找我喔,远程帮你看看..
唐诗三百首 2013-04-17
  • 打赏
  • 举报
回复
引用 18 楼 DBA_Huangzj 的回复:
唐诗你在水锅回帖的地方把他博客拿出来?只能说水锅太笨了
借鉴借鉴,一切为了解决问题.
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
引用 17 楼 ap0405140 的回复:
试试把触发器代码里的: SET XACT_ABORT ON 这句删掉后再试呢.
这样也不行
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
引用 5 楼 ap0405140 的回复:
参考 http://blog.csdn.net/wufeng4552/article/details/4796846
我都试过了不行啊
發糞塗牆 2013-04-17
  • 打赏
  • 举报
回复
唐诗你在水锅回帖的地方把他博客拿出来?只能说水锅太笨了
唐诗三百首 2013-04-17
  • 打赏
  • 举报
回复
试试把触发器代码里的: SET XACT_ABORT ON 这句删掉后再试呢.
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
关键是直接插入可以,通过触发器插入,有问题
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
引用 14 楼 ap0405140 的回复:
引用 8 楼 xuexiaodong2009 的回复: 急求牛人解决 参考这篇文章: http://blog.csdn.net/wufeng4552/article/details/4796846 有针对性的解決方案! (2.2.1)双方启动MSDTC服务 MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed……
都试过了,不行的
唐诗三百首 2013-04-17
  • 打赏
  • 举报
回复
引用 8 楼 xuexiaodong2009 的回复:
急求牛人解决
参考这篇文章: http://blog.csdn.net/wufeng4552/article/details/4796846 有针对性的解決方案! (2.2.1)双方启动MSDTC服务 MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。 (2.2.2) 打开双方135端口 MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放。 (2.2.3)保证链接服务器中语句没有访问发起事务服务器的操作 在发起事务的服务器执行链接服务器上的查询、视图或存储过程中含有访问发起事务服务器的操作,这样的操作叫做环回(loopback),是不被支持的,所以要保证在链接服务器中不存在此类操作。 (2.2.4)在事务开始前加入set xact_abort ON语句 对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。 (2.2.5)MSDTC设置 管理工具―组件服务―计算机―我的电脑(右键)―MSDTC―安全配置 在安全配置窗口中做如下设置: (2.2.5.1)选中“网络DTC访问” (2.2.5.2)在客户端管理中选中“允许远程客户端”“允许远程管理” (2.2.5.3)在事务管理通讯中选“允许入站”“允许出站”“不要求进行证” (2.2.5.4)保证DTC登陆账户为:NT Authority/NetworkService (2.2.6)链接服务器和名称解析问题 建立链接sql server服务器,通常有两种情况: 第一种情况,产品选”sql server” EXEC sp_addlinkedserver @server='linkServerName', @srvproduct = N'SQL Server' 这种情况@server(linkServerName)就是要链接的sqlserver服务器名或者ip地址。 第二种情况访问接口选“Microsoft OLE DB Provider Sql Server”或“Sql Native Client” EXEC sp_addlinkedserver @server='linkServerName', @srvproduct='', @provider='SQLNCLI', @datasrc='sqlServerName' 这种情况,@datasrc(sqlServerName)就是要链接的实际sqlserver服务器名或者ip地址。 Sql server数据库引擎是通过上面设置的服务器名或者ip地址访问链接服务器,DTC服务只通过服务器名地址访问链接服务器,所以要保证数据库引擎和DTC都能通过服务器名或者ip地址访问到链接服务器。 数据库引擎和DTC解析服务器的方式不太一样,下面分别叙述 数据库引擎 第一种情况的@server或者第二种情况的@datasrc设置为ip地址时,数据库引擎会根据ip地址访问链接服务器,这时不需要做名称解析。 第一种情况的@server或者第二种情况的@datasrc设置为sql server服务器名时,需要做名称解析,就是把服务器名解析为ip地址。 有两个办法解析服务器名: 一是在sql server客户端配置中设置一个别名,将上面的服务器名对应到链接服务器的ip地址。 二是在“C:/WINDOWS/system32/drivers/etc/hosts”文件中增加一条记录: xxx.xxx.xxx.xxx 服务器名 作用同样是把服务器名对应到链接服务器的ip地址。 DTC 不管哪一种情况,只要@server设置的是服务器名而不是ip地址,就需要进行名称解析,办法同上面第二种办法,在hosts文件中增加解析记录,上面的第一种办法对DTC不起作用。 如果@server设置的是ip地址,同样不需要做域名解析工作 (2.2.7)远程服务器上的名称解析 分布式事务的参与服务器是需要相互访问的,发起查询的服务器要根据机器名或ip查找远程服务器的,同样远程服务器也要查找发起服务器,远程服务器通过发起服务器的机器名查找服务器,所以要保证远程服务器能够通过发起服务器的机器名访问到发起服务器。一般的,两个服务器在同一网段机器名能就行很好的解析,但是也不保证都能很好的解析,所以比较保险的做法是:在远程服务器的在“C:/WINDOWS/system32/drivers/etc/hosts”文件中增加一条记录:xxx.xxx.xxx.xxx 发起服务器名
xuexiaodong2009 2013-04-17
  • 打赏
  • 举报
回复
引用 12 楼 DBA_Huangzj 的回复:
我不是很会搞这个,如果实在没解决办法,试一下用复制技术,这个可以精确到列级别的同步,配置起来也挺好用,而且开销方面比触发器好很多
两个表还有点不太一样,需要简单处理后,才能插入的,能行吗
發糞塗牆 2013-04-17
  • 打赏
  • 举报
回复
我不是很会搞这个,如果实在没解决办法,试一下用复制技术,这个可以精确到列级别的同步,配置起来也挺好用,而且开销方面比触发器好很多
KevinLiu 2013-04-17
  • 打赏
  • 举报
回复
两台机器的DTC都配置了吗?另外你可以用DTCPing工具测试一下,有错误发上来。
wddas1314 2013-04-17
  • 打赏
  • 举报
回复
加载更多回复(10)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧