通过链接服务器的触发器同步数据出现如下问题 ,求牛人指点
操作体统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 SQLNCLI 没有活动事务 无法启动分布式事务。
[解决办法]
两个机器的DTC都设置一下~
[解决办法]
两台机器的DTC都配置了吗?另外你可以用DTCPing工具测试一下,有错误发上来。
[解决办法]
参考这篇文章: http://blog.csdn.net/wufeng4552/article/details/4796846
有针对性的解方案!
(2.2.1)双方启动MSDTC服务
MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC—istributed 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 发起服务器名
[解决办法]
LZ可私信找我喔,远程帮你看看..
[解决办法]
真的不建议在触发器里面操作远程数据。