SQL Server2000 ,在trigger中使用DB link

前几天create 了一个trigger,在里面要使用到DB link去查询另一台server的资料,

本以为是很简单的事,不想去搞了几天都没解决。

DB link是早已经建好了的,并且在其他地方(如store procedure等)都正常使用。

但到了trigger里,就会报错:

 

English version:

The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.

[OLE/DB provider returned message: New transaction cannot enlist in the specified transaction coordinator. ]

OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].

 

中文版:

由於 OLE DB Provider 'SQLOLEDB' 無法開始分散式交易,所以無法執行此操作。
[OLE/DB provider returned message: 在指定異動協調員中無法編列新異動。]
OLE DB 錯誤追蹤 [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。

 

头大了,没碰到过这样的问题。。。

第一时间想起csdn,

http://topic.csdn.net/u/20090312/09/1b8f2fdf-390d-4ddf-899f-005122339cea.html

得到“完美行动”的解答,估计是MSDTC的问题,

只说说自己的步骤,出问题可别找我负责啊,呵呵


开始--运行--dcomcnfg.exe
元件服务--电脑--我的电脑(右键--属性)
MSDTC --安全性设定 --然后把“网络DTC存取”勾上,把“允许远端用户端”勾上,“允许远端系统管理”勾上, 在交易管理通讯里,“允许输入”勾上,“允许输出”勾上,“不需要验证”勾上
确定后,应该是会自动启动MSDTC service (Distributed Transaction Coordinator)
重启机器后,就可以在trigger里用到db link了。。。。

没明白原理,也不知道这样勾上那些东西,是否存在安全性问题,
所以暂时没用到公司服务器上(只在个人电脑上测试,ok)。

 

另外,高升兄的一篇blog,Sql Server 2005(64位) 连接Sql Server 2000(32位),蛮详细的介绍,呵呵

http://blog.csdn.net/hb_gx/archive/2007/10/15/1826436.aspx

 

 

/** Add at 2009-3-19  DB link 在cursor中的使用**/

一支store procedure 中(SQL2000),有一段sql statement是使用到cursor,需要去查询db link的一个table(此table在SQL2005上)。

类似 declare c1 cursor for select * from DBlink.DBname.dbo.T

提示如下error message:

Statement(s) could not be prepared. [SQLSTATE 42000] (Error 8180)
Incorrect syntax near 'Tbl1001'. [SQLSTATE 42000] (Error 102)
Incorrect syntax near 'Tbl1001'. [SQLSTATE 42000] (Error 102)
Incorrect syntax near 'Tbl1001'. [SQLSTATE 42000] (Error 102)
Incorrect syntax near 'FASTFIRSTROW'. If this is intended as a part of
a table hint, A WITH keyword and parenthesis are now required. See SQL
Server Books Online for proper syntax. [SQLSTATE 42000] (Error 1018).
The step failed.


处理方式,将cursor定义成只读应该就可以了,比如加上 INSENSITIVE,如下:

declare c1 INSENSITIVE cursor  for select  * from DBlink.DBname.dbo.T

就可以跑起來了。。。

 

不过相同的语句,在SQl2005 连接SQL2000时,不用加INSENSITIVE也可以过。。。。。

以上仅供参考!

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭