| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3631 人关注过本帖
标题:SQL Server触发器内调用远程链接服务器的问题!
只看楼主 加入收藏
manzulinwf
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-15
收藏
 问题点数:0 回复次数:14 
SQL Server触发器内调用远程链接服务器的问题!


1、假定我有两台服务器,本地服务器为server1,远程链接服务器server2。
2、本地和远程的数据表结构都相同,如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test]
GO

CREATE TABLE [dbo].[test] (
[a] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[b] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[c] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

3、建立链接服务器
if exists(select 1 from master..sysservers where srvname='srv_lnk')
exec sp_dropserver 'srv_lnk','droplogins'
go
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','server2'
/* srv_lnk:链接服务器名称,server2:远程服务器 */
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','sa'
/* srv_lnk:链接服务器名称,sa:登陆远程账号,sa:登陆远程密码 */
go

4、在本地服务器Server1的表test上创建触发器,如下所示:
CREATE TRIGGER t_test ON [dbo].[test]
FOR INSERT
AS
insert into srv_lnk.pubs.dbo.test
select * from inserted
--srv_lnk:创建的链接服务器
go

5、在SQL查询分析器内的测试语句:
insert into test values('a','b','c')
6、错误描述:
服务器: 消息 7391,级别 16,状态 1,过程 t_test,行 4
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: New transaction cannot enlist in the specified transaction coordinator. ]
7、故障诊断:
1> 连接服务器配置正常,以select * from srv_lnk.pubs.dbo.test在查询分析器内测试,有正确信息返回。
2> 服务内Distributed Transaction Coordinator已启动。
3> SQL Server的MS DTC也正常启动。


搜索更多相关主题的帖子: SQL 服务器 触发器 Server 链接 
2006-05-15 16:33
manzulinwf
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-15
收藏
得分:0 
很着急,希望各位高手帮帮忙!
很着急,希望各位高手帮帮忙!
谢谢!
2006-05-15 16:38
lakerman
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-5-16
收藏
得分:0 
2006-05-16 09:46
manzulinwf
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-15
收藏
得分:0 
谢谢楼上大哥的解答,不过兄弟使用的机器环境是Win2000 Server + SQL Server 2000,
您提供的帖子好像是针对Microsoft Windows Server 2003 。
不过还是万分的感谢!
2006-05-16 17:27
manzulinwf
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-15
收藏
得分:0 

斑竹呢?还有各位高手快来帮帮忙啊!

2006-05-22 10:14
dsw18
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-5-14
收藏
得分:0 
谢谢
2006-05-23 16:36
manzulinwf
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-15
收藏
得分:0 
斑竹呢?
还有各位高手怎么还不来呢?
2006-06-03 10:55
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
本文属spanzhang原创,其blog地址为:http://blog.csdn.net/spanzhang。引用或转贴请注明出处,谢谢!!

服务器: 消息 7391,级别 16,状态 1,行 6
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分
布式事务。
[OLE/DB provider returned message: 不能在指定的事务处理器中
获得新事务。]
---------------------------------------------------------------------------------------------
服务器: 消息 8520,级别 20,状态 1,行 8
内部 MSDTC 事务的提交失败: Result Code = 0x8004d019。

连接中断
---------------------------------------------------------------------------------------------

这个问题,我想做过MS SQLServer分布式数据库系统的人都遇到过。简单的时候是服务没启动,135端口没打开之类的。但等你将这些东西都搞定后仍然不行的时候,你就会感到绝望并且怀疑是不是MS根本就不能使用OLEDB来启动分布式事务了。其实,很多时候一个问题在出现的时候会让你觉得神秘,但解决起来其实很简单。下面就是答案:

1、运行 regedt32,浏览至 HKEY_LOCAL_MACHINE oftware\Microsoft\MSDTC。
添加一个 DWORD 值 TurnOffRpcSecurity,值数据为 1。
2、重启MS DTC服务。
3、打开“管理工具”的“组件服务”。
a. 浏览至"启动管理工具"。 b. 选择"组件服务"。 c. 展开"组件服务"树,然后展开"我的电脑"。 d. 右键单击"我的电脑",然后选择"属性"。 在 MSDTC 选项卡中,确保选中了下列选项:
网络 DTC 访问 网络管理 网络事务XA 事务
另外,"DTC 登录帐户"一定要设置为"NT Authority\NetworkService"。4、重启MS DTC服务。
5、再次运行 regedt32,浏览至 HKEY_LOCAL_MACHINE oftware\Microsoft\MSDTC,然后删除 TurnOffRpcSecurity 项。

PS:最后再说一句,MSDTC问题没有一个很明确的原因,有人说重转系统就好了,我从来没有碰到过这样的问题。

2006-06-04 09:50
manzulinwf
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-5-15
收藏
得分:0 
首先万分感谢斑竹,不过下面的选项我一直没有找到,可否抓图明示:
在 MSDTC 选项卡中,确保选中了下列选项:
网络 DTC 访问 网络管理 网络事务XA 事务
2006-06-05 07:57
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
请确认图中内容,系统不同可能略有出入

图片附件: 游客没有浏览图片的权限,请 登录注册


2006-06-05 09:32
快速回复:SQL Server触发器内调用远程链接服务器的问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019028 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved