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之分布式事务