日期:2014-05-18  浏览次数:20426 次

MS SQLServer 在 触发器 中 使用 联接服务器 无法 跨库 操作数据的问题
我有两台机器,A,B,都装了MS SQL Server 2005

现在在B里建了个触发器,往A数据库里插数据,报错;在B的SQL查询分析器里select 查询、insert 插入 A的数据都没问题,只是写入到触发器后,调用触发器时出错,具体情况如下:
Microsoft SQL Server Management Studio
---------------------------
未更新任何行。

未提交行 10 中的数据。
错误源: .Net SqlClient Data Provider。
错误信息: 无法执行该操作,因为链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。

链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。

请更正错误并重试,或按 Esc 取消更改。
---------------------------
确定 帮助  

跨库访问应该是没问题的

因为 使用如下语句可以完成B中数据插入A中

  insert into openrowset('SQLOLEDB' , '192.168.0.86' ; 'sa' ; 'sa' , tr55_bk.dbo.user)  
  select * from tr55.dbo.trafaxuser  


但是写入触发器后就有问题。


触发器如下

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;

盼高手解答


------解决方案--------------------

错误信息: 无法执行该操作,因为链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。


windows系统 ---运行--cmd 

net start msdtc ---启动分布式事务
------解决方案--------------------
触发器是事务操作,对连接服务器操作是不合适的

2005+的话可以考虑用Service Broker实现跨服务器操作,或者你搜索下异步触发器,可以找到一些用法的说明。
------解决方案--------------------
分布事务不支持显示事务,
去掉
begin distributed tran

还有问题参考
http://www.duote.com/tech/6/15052.html
------解决方案--------------------
SQL code

--創建服務器連接
exec   sp_addlinkedserver     'mgfTS_lnk', ' ', 'SQLOLEDB ', '192.168.0.1'--制定連接對象,與間接名稱
exec   sp_addlinkedsrvlogin   'mgfTS_lnk', 'false ',null, 'user1', 'passwd'--連接用戶/密碼
exec sp_serveroption 'mgfTS_lnk' ,'query timeout','30' ;--設置響應時間

--開啓外部RPC配置,允许其它SQL Server使用RPC远程连接到本SQL Server
EXEC   sp_serveroption   'mgfTS','rpc out','TRUE'  

(也可在企业管理器中-->数据库-->安全-->链接数据库-->点击你需要配置的链接数据库-->属性页-->   
  "server   options"-->勾选rpc   out)
以下是在被訪問端數據庫設置
--設定允許外聯

exec sp_configure 'show advanced options',1   --開啓高級設置
reconfigure WITH OVERRIDE;

exec sp_configure 'Ad Hoc Distributed Queries',1--允許openrowset opendatasource訪問
reconfigure WITH OVERRIDE;
exec sp_configure 'show advanced options',0   --關閉高級設置
reconfigure WITH OVERRIDE;

--在其他服務器上的調用方式
SELECT * FROM mgfTS_lnk.TestDB.dbo.proTable where proName like '%PAPB%'

------解决方案--------------------
参考 http://blog.csdn.net/wufeng4552/article/details/4796846

SQL Server之分布式事务