赞
踩
前几天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也可以过。。。。。
以上仅供参考!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。