DB link 不能用在trigger里嗎?

playwarcraft 2009-03-12 09:09:29
大送300分。。。救命!好久沒弄sql,一弄就碰到問題。。。。。

DB link 不能用在trigger里嗎?


Create trigger tri_test
on T
for insert
AS
begin
select * from openquery(DBlinkedTest,'select * from XX.dbo.test')
end
GO



一跑就show error message:
Server: Msg 7391, Level 16, State 1, Procedure trigger_test, Line 5
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].

同樣的語句,不管是直接運行,
或者放在store procedure里, 都是ok的。。。。就在trigger里不能過??

問微軟的顧問,說trigger里直接可以用openquery啊。。。。。。


...全文
729 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
nzperfect 2009-04-10
  • 打赏
  • 举报
回复
csdn抽筋了,早结的贴又变成未结的了...
playwarcraft 2009-04-10
  • 打赏
  • 举报
回复
早结了怎么又出来了?
taoistong 2009-04-10
  • 打赏
  • 举报
回复
怎么还不结
Andy__Huang 2009-04-10
  • 打赏
  • 举报
回复
这么久应该解决了吧.....
sp4 2009-04-10
  • 打赏
  • 举报
回复
应该是分布式事务权限问题吧

因为跨数据库,触发器本身也是个事务,这样对分布式事务应该有影响。

而且这个触发器创建似乎有问题 set ansi_nulls,set ansi_warnings 应该有设置才对吧,我都好久没怎么搞SQL了,说不大清楚了,呵呵
mjldnz1 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 playwarcraft 的回复:]
应该是完美说的原因,
MSDTC 的安全性设定问题吧,
反正差不多吧把能勾的都勾上,重启server后就可以了。。。感谢 perfectaction

上面看到说也有人没解决,提供下线索,希望能有所帮助,只说说我的步骤:
开始--运行--dcomcnfg.exe
元件服务--电脑--我的电脑(右键--属性)
MSDTC --安全性设定 --然后把“网络DTC存取”勾上,把“允许远端用户端”勾上,“允许远端系统管理”勾上, 在交易管理通讯里,“允许输入”…
[/Quote]

通过这样设置就行了。
谢谢,我就是用这个方法解决了问题。
nzperfect 2009-03-13
  • 打赏
  • 举报
回复
全勾上,并选择不验证.
如果你的操作系统是win2003,并且打了sp2后,在访问量大时还会频频出现超时错误,还需要改注册表.

--如果你是sql 2008,还需要启用sql server 的分布式:
sp_configure 'Ad Hoc Distributed Queries',1
playwarcraft 2009-03-13
  • 打赏
  • 举报
回复
应该是完美说的原因,
MSDTC 的安全性设定问题吧,
反正差不多吧把能勾的都勾上,重启server后就可以了。。。感谢 perfectaction

上面看到说也有人没解决,提供下线索,希望能有所帮助,只说说我的步骤:
开始--运行--dcomcnfg.exe
元件服务--电脑--我的电脑(右键--属性)
MSDTC --安全性设定 --然后把“网络DTC存取”勾上,把“允许远端用户端”勾上,“允许远端系统管理”勾上, 在交易管理通讯里,“允许输入”勾上,“允许输出”勾上,“不需要验证”勾上
确定后,应该是会自动启动MSDTC service (Distributed Transaction Coordinator)
重启机器后,就可以在trigger里用到db link了。。。。

没明白原理,也不知道这样勾上那些东西,是否存在安全性问题,
所以暂时没用到公司服务器上(只在个人电脑上测试,ok)。
yuyangyangde 2009-03-12
  • 打赏
  • 举报
回复
帮顶
mengmou 2009-03-12
  • 打赏
  • 举报
回复
楼主快来结贴
mengmou 2009-03-12
  • 打赏
  • 举报
回复
加上这一句

set xact_abort on

好多年没得分了,求您把三百分全给我吧,谢谢啊!
xieyueqing 2009-03-12
  • 打赏
  • 举报
回复
我也试过在Trigger里面用链接服务器,也是不行,最后不了了之了..
等不到来世 2009-03-12
  • 打赏
  • 举报
回复
估计你这个触发器造成回环(loopback)操作,导致访问链接服务器失败。
在进行分布式事务时,访问链接服务器的时候不能对本机数据进行操作。
肥龙上天 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 playwarcraft 的回复:]
俺只是為了方便說明啊。。。
具體trigger里不是這么一條, 但就是這么一條都過不了。。。。
db link 是早建好了
在store procedure ,或者其他地方都用的好好的。。。
就是放到trigger里去,就會報錯。。。
手上有sql server的試試看,是不是我的什麽設置沒弄好呢?
[/Quote]
乌龟提供的方法你都参考一下!
playwarcraft 2009-03-12
  • 打赏
  • 举报
回复
e........
300分吶。。。不能沉啊~~~
playwarcraft 2009-03-12
  • 打赏
  • 举报
回复
俺只是為了方便說明啊。。。
具體trigger里不是這么一條, 但就是這么一條都過不了。。。。
db link 是早建好了
在store procedure ,或者其他地方都用的好好的。。。
就是放到trigger里去,就會報錯。。。
手上有sql server的試試看,是不是我的什麽設置沒弄好呢?
sdhdy 2009-03-12
  • 打赏
  • 举报
回复
触发器一般不会这么写:只写一条select 语句,这根本不是触发器的作用。
如果这样的话,根本就不比用触发器,用存储过程就可以。
sdhdy 2009-03-12
  • 打赏
  • 举报
回复
Create trigger tri_test 
on T
for insert
AS
begin
--add 加上insert 试试
insert table tb
select * from openquery(DBlinkedTest,'select * from XX.dbo.test')
end
GO
sdhdy 2009-03-12
  • 打赏
  • 举报
回复
对,照大乌龟的再检查一下。
肥龙上天 2009-03-12
  • 打赏
  • 举报
回复

顶乌龟!
加载更多回复(16)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧