触发器使用链接服务器报分布式错误

weisai 2010-04-15 10:14:11
数据库是SQL 2005。
建一个存储过程,其中使用到链接服务器(连到oracle数据库)。
单独执行存储过程,正常。

然后建了一个触发器(已经写了 set xact_abort on ),触发器中调用存储过程,报什么分布式错误。

已使用http://hi.baidu.com/binli33/blog/item/caa042c20ce8dc32e4dd3be6.html中提到的检查过,没问题。

请问怎么解决?

...全文
212 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
drpuser 2012-05-09
  • 打赏
  • 举报
回复
也遇到到同样的问题,sqlserver2005 在触发器中使用了链接服务器,直接在查询分析器中触发没有问题。但是在程序中调用就报错。大家有什么好办法吗?
Garnett_KG 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 weisai 的回复:]

引用 7 楼 garnett_kg 的回复:
触发器中本身就是包含事务的

你试着建另外一个链接服务器,连到sql2005或者sql2000,在触发器内使用,然后看能否成功。如果可以,说明是oracle端的问题,下一步再做检查。


但是为什么我单独执行存储过程(存储过程中才使用链接服务器)就可以呢
[/Quote]


单独执行存储过程可以是因为 没有启用分布式事务啊!!
不信你可以这样试下面的代码,也是不行的。
begin tran
执行你的储存过程
commit tran


当前你要做的是确定是不是oracle端的provider不能使用msdtc,建另一个链接服务器(sql2000orsql2005)排除一下吧。
weisai 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 perfectaction 的回复:]
估计:SET XACT_ABORT 为 OFF 可能可以。。。。
[/Quote]

出现“分布式事务已完成,请将此会话登记到新事务或者NULL事务中”
weisai 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 garnett_kg 的回复:]
触发器中本身就是包含事务的

你试着建另外一个链接服务器,连到sql2005或者sql2000,在触发器内使用,然后看能否成功。如果可以,说明是oracle端的问题,下一步再做检查。
[/Quote]

有没有办法在触发器中把事务去掉
weisai 2010-04-15
  • 打赏
  • 举报
回复
错误信息大概是这样的:
无法执行操作,因为链接服务器wmtst_pos 的OLE DB 访问接口 MSDAORA 无法启用分布式事务。

什么是MSDAORA
nzperfect 2010-04-15
  • 打赏
  • 举报
回复
看看是否有用:
http://forums.oracle.com/forums/thread.jspa?messageID=2713812
http://support.microsoft.com/kb/280106
weisai 2010-04-15
  • 打赏
  • 举报
回复
怎么贴图

weisai 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 perfectaction 的回复:]
估计:SET XACT_ABORT 为 OFF 可能可以。。。。
[/Quote]

一开始 没有SET XACT_ABORT On的,不行,后来才上网查到加上去的
nzperfect 2010-04-15
  • 打赏
  • 举报
回复
估计:SET XACT_ABORT 为 OFF 可能可以。。。。
nzperfect 2010-04-15
  • 打赏
  • 举报
回复
贴一下具体出错信息
weisai 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 garnett_kg 的回复:]
触发器中本身就是包含事务的

你试着建另外一个链接服务器,连到sql2005或者sql2000,在触发器内使用,然后看能否成功。如果可以,说明是oracle端的问题,下一步再做检查。
[/Quote]

但是为什么我单独执行存储过程(存储过程中才使用链接服务器)就可以呢
weisai 2010-04-15
  • 打赏
  • 举报
回复
还是不行。

我触发器是这样的

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
alter TRIGGER tri_jr_AutoUpdateASN
ON dbo.SEOutStock
FOR UPDATE
AS
set XACT_ABORT on
if update(FCheckerID)
begin
declare @FID as int
declare @billNo as nvarchar(20)

declare @oldFCheckerID as int
declare @newFCheckerID as int

SELECT @oldFCheckerID=isnull(FCheckerID,0) FROM deleted
SELECT @billNo=FbillNo, @newFCheckerID=isnull(FCheckerID,0) FROM inserted


declare @sql as nvarchar(200)
--set @sql=' select @p=count(HOST_INPT_ID) from openquery(wmtst_pos,''select HOST_INPT_ID from inpt_asn_hdr where SHPMT_NBR ='''''+ 'I'+ @Billno+''''''')'
--declare @p int
--exec sp_executesql @sql,N'@p int output',@p output


if @oldFCheckerID=0 and @newFCheckerID>0 --审核
begin
--if @p=0 --新增
-- begin
begin distributed tran
exec pr_jr_ImportASN @billNo,11,'02'
commit tran

-- end
--if @p>0 --修改
-- begin
-- exec pr_jr_ImportASN @billNo,11,'01'
-- end
end

/* if @oldFCheckerID>0 and @newFCheckerID=0 --反审核
begin

exec pr_jr_ImportASN @billNo,11,'03'
end
*/
end
GO
Garnett_KG 2010-04-15
  • 打赏
  • 举报
回复
触发器中本身就是包含事务的

你试着建另外一个链接服务器,连到sql2005或者sql2000,在触发器内使用,然后看能否成功。如果可以,说明是oracle端的问题,下一步再做检查。
--小F-- 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 weisai 的回复:]
没有使用事务。
[/Quote]

在触发器中启用事务试试
weisai 2010-04-15
  • 打赏
  • 举报
回复
我奇怪的是为什么单独执行存储过程就可以,
但触发器中调用就不行。

还有一个是,如果光是在触发器中出现链接服务器,也会报同样的错
weisai 2010-04-15
  • 打赏
  • 举报
回复
没有使用事务。

--小F-- 2010-04-15
  • 打赏
  • 举报
回复
set xact_abort on
begin distributed tran
...
commit tran
是这么做的吗?
htl258_Tony 2010-04-15
  • 打赏
  • 举报
回复
此贴能解决就帮你推荐
htl258_Tony 2010-04-15
  • 打赏
  • 举报
回复
触发器我昨天试了也是同样的错误,帮顶。

34,590

社区成员

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

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