跨服务器插入报错

chestnut 2013-12-24 11:47:49
【背景】:在服务器A上的数据库操作
exec sp_addlinkedserver '服务器B', ' ', 'SQLOLEDB', '服务器B的ip地址 '
exec sp_addlinkedsrvlogin '服务器B','', 'false ',null, '服务器B上数据库用户名', '服务器B上数据库密码'
select * from 服务器B.testdb.dbo.testtb
insert into 服务器B.testdb.dbo.testtb as select * from 服务器A上某表testtb
以上两个操作都是正常的
【问题】写了个触发器,当服务器A上的testtb有数据插入时,自动插入数据到服务器B上的testtb:
触发器语句如下:
createtrigger tr_test
on dbo.testtb
after insert
as
declare @sql nvarchar(max)
declare @dbname varchar(100)
declare @tblname varchar(100)
declare @type varchar(10)
declare @Tsql nvarchar(4000)
declare @PostTime varchar(20)
declare @LoginName varchar(20)
declare @hostname varchar(20)
begin
select @dbname=[dbname],@Tsql=[TSQLCommand],@PostTime=[PostTime],@LoginName=[LoginName],@hostname=[hostname] from inserted
insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname])
values(@dbname,@Tsql,@PostTime,@LoginName,@hostname)
end

报错:链接服务器"服务器B"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息 "该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。
消息 7391,级别 16,状态 2,过程 tr_test,第 15 行
无法执行该操作,因为链接服务器 "服务器B" 的 OLE DB 访问接口 "SQLNCLI11" 无法启动分布式事务[b]。

PS:[/b]
单独执行触发器中间那条insert语句是没有问题的
...全文
180 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzw_0736 2013-12-26
  • 打赏
  • 举报
回复
MSDTC都配置了什么?或者说MSDTC是怎么配置的?
chestnut 2013-12-26
  • 打赏
  • 举报
回复
引用 10 楼 SmithLiu328 的回复:
[quote=引用 楼主 journeysxy 的回复:] 【背景】:在服务器A上的数据库操作 exec sp_addlinkedserver '服务器B', ' ', 'SQLOLEDB', '服务器B的ip地址 ' exec sp_addlinkedsrvlogin '服务器B','', 'false ',null, '服务器B上数据库用户名', '服务器B上数据库密码' select * from 服务器B.testdb.dbo.testtb insert into 服务器B.testdb.dbo.testtb as select * from 服务器A上某表testtb 以上两个操作都是正常的 【问题】写了个触发器,当服务器A上的testtb有数据插入时,自动插入数据到服务器B上的testtb: 触发器语句如下:
createtrigger tr_test
on dbo.testtb
after insert
as
declare @sql nvarchar(max)
declare @dbname varchar(100)
declare @tblname varchar(100)
declare @type varchar(10)
declare @Tsql nvarchar(4000)
declare @PostTime varchar(20)
declare @LoginName varchar(20)
declare @hostname varchar(20)
begin
select @dbname=[dbname],@Tsql=[TSQLCommand],@PostTime=[PostTime],@LoginName=[LoginName],@hostname=[hostname] from inserted
insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname])
values(@dbname,@Tsql,@PostTime,@LoginName,@hostname)
end
报错:链接服务器"服务器B"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息 "该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。 消息 7391,级别 16,状态 2,过程 tr_test,第 15 行 无法执行该操作,因为链接服务器 "服务器B" 的 OLE DB 访问接口 "SQLNCLI11" 无法启动分布式事务[b]。 PS:[/b]单独执行触发器中间那条insert语句是没有问题的
MSDTC配置好了吗?分布式事务是借助这个工作的。[/quote]在两台服务器上都开启了MSDTC的配置了,但是还是不行
chestnut 2013-12-26
  • 打赏
  • 举报
回复
引用 12 楼 mcxhh2005 的回复:
用linkedserver 名称应该不会出错的啊
不会。因为单独执行是可以的,但是放在存储过程或者触发器就不OK了。。
ChinaITOldMan 2013-12-25
  • 打赏
  • 举报
回复
用linkedserver 名称应该不会出错的啊
chestnut 2013-12-25
  • 打赏
  • 举报
回复
引用 10 楼 SmithLiu328 的回复:
[quote=引用 楼主 journeysxy 的回复:] 【背景】:在服务器A上的数据库操作 exec sp_addlinkedserver '服务器B', ' ', 'SQLOLEDB', '服务器B的ip地址 ' exec sp_addlinkedsrvlogin '服务器B','', 'false ',null, '服务器B上数据库用户名', '服务器B上数据库密码' select * from 服务器B.testdb.dbo.testtb insert into 服务器B.testdb.dbo.testtb as select * from 服务器A上某表testtb 以上两个操作都是正常的 【问题】写了个触发器,当服务器A上的testtb有数据插入时,自动插入数据到服务器B上的testtb: 触发器语句如下:
createtrigger tr_test
on dbo.testtb
after insert
as
declare @sql nvarchar(max)
declare @dbname varchar(100)
declare @tblname varchar(100)
declare @type varchar(10)
declare @Tsql nvarchar(4000)
declare @PostTime varchar(20)
declare @LoginName varchar(20)
declare @hostname varchar(20)
begin
select @dbname=[dbname],@Tsql=[TSQLCommand],@PostTime=[PostTime],@LoginName=[LoginName],@hostname=[hostname] from inserted
insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname])
values(@dbname,@Tsql,@PostTime,@LoginName,@hostname)
end
报错:链接服务器"服务器B"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息 "该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。 消息 7391,级别 16,状态 2,过程 tr_test,第 15 行 无法执行该操作,因为链接服务器 "服务器B" 的 OLE DB 访问接口 "SQLNCLI11" 无法启动分布式事务[b]。 PS:[/b]单独执行触发器中间那条insert语句是没有问题的
MSDTC配置好了吗?分布式事务是借助这个工作的。[/quote]有个问题不明白,为什么单独在服务器A上插入到服务器B上是可以执行的,然后把语句放到触发器中就无法执行?这中间的原因想弄明白
LongRui888 2013-12-24
  • 打赏
  • 举报
回复
select @dbname=[dbname],@Tsql=[TSQLCommand],@PostTime=[PostTime],@LoginName=[LoginName],@hostname=[hostname] from inserted insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname]) values(@dbname,@Tsql,@PostTime,@LoginName,@hostname) 改成这样试试: insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname]) select [dbname],[TSQLCommand],[PostTime],[LoginName],[hostname] from inserted
發糞塗牆 2013-12-24
  • 打赏
  • 举报
回复
执行过没有?
sp_configure 'show advanced options', 1 
 GO
 RECONFIGURE
 GO
 sp_configure 'Ad Hoc Distributed Queries', 1 
 GO
 RECONFIGURE
 GO
KevinLiu 2013-12-24
  • 打赏
  • 举报
回复
引用 楼主 journeysxy 的回复:
【背景】:在服务器A上的数据库操作 exec sp_addlinkedserver '服务器B', ' ', 'SQLOLEDB', '服务器B的ip地址 ' exec sp_addlinkedsrvlogin '服务器B','', 'false ',null, '服务器B上数据库用户名', '服务器B上数据库密码' select * from 服务器B.testdb.dbo.testtb insert into 服务器B.testdb.dbo.testtb as select * from 服务器A上某表testtb 以上两个操作都是正常的 【问题】写了个触发器,当服务器A上的testtb有数据插入时,自动插入数据到服务器B上的testtb: 触发器语句如下:
createtrigger tr_test
on dbo.testtb
after insert
as
declare @sql nvarchar(max)
declare @dbname varchar(100)
declare @tblname varchar(100)
declare @type varchar(10)
declare @Tsql nvarchar(4000)
declare @PostTime varchar(20)
declare @LoginName varchar(20)
declare @hostname varchar(20)
begin
select @dbname=[dbname],@Tsql=[TSQLCommand],@PostTime=[PostTime],@LoginName=[LoginName],@hostname=[hostname] from inserted
insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname])
values(@dbname,@Tsql,@PostTime,@LoginName,@hostname)
end
报错:链接服务器"服务器B"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息 "该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。 消息 7391,级别 16,状态 2,过程 tr_test,第 15 行 无法执行该操作,因为链接服务器 "服务器B" 的 OLE DB 访问接口 "SQLNCLI11" 无法启动分布式事务[b]。 PS:[/b]单独执行触发器中间那条insert语句是没有问题的
MSDTC配置好了吗?分布式事务是借助这个工作的。
小魚人 2013-12-24
  • 打赏
  • 举报
回复
引用 6 楼 journeysxy 的回复:
[quote=引用 3 楼 weijia_liang 的回复:] 跨數據庫的觸發器是要配置分佈式的(兩台的) 你可以用存儲過程實現這個功能 啊
可以麻烦说的稍微详细些吗[/quote]如果真要配置的話看看下面鏈接吧 我測試是可以的,win7 跟win2003R2 http://blog.163.com/lpw_email/blog/static/962543292010626113041578/
小魚人 2013-12-24
  • 打赏
  • 举报
回复
引用 6 楼 journeysxy 的回复:
[quote=引用 3 楼 weijia_liang 的回复:] 跨數據庫的觸發器是要配置分佈式的(兩台的) 你可以用存儲過程實現這個功能 啊
可以麻烦说的稍微详细些吗[/quote] 你搜下配置吧,之前弄過 現在我都不用了,用交易複寫,或者直接使用存儲過程代替了
LongRui888 2013-12-24
  • 打赏
  • 举报
回复
引用 4 楼 journeysxy 的回复:
[quote=引用 2 楼 yupeigu 的回复:] select @dbname=[dbname],@Tsql=[TSQLCommand],@PostTime=[PostTime],@LoginName=[LoginName],@hostname=[hostname] from inserted insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname]) values(@dbname,@Tsql,@PostTime,@LoginName,@hostname) 改成这样试试: insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname]) select [dbname],[TSQLCommand],[PostTime],[LoginName],[hostname] from inserted
不行,只要是触发器里边执行的都会报同样的错误,但是单独执行就没错 [/quote] 要不把分布式事务打开呢
chestnut 2013-12-24
  • 打赏
  • 举报
回复
引用 3 楼 weijia_liang 的回复:
跨數據庫的觸發器是要配置分佈式的(兩台的) 你可以用存儲過程實現這個功能 啊
可以麻烦说的稍微详细些吗
chestnut 2013-12-24
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
执行过没有?
sp_configure 'show advanced options', 1 
 GO
 RECONFIGURE
 GO
 sp_configure 'Ad Hoc Distributed Queries', 1 
 GO
 RECONFIGURE
 GO
两台服务器上都执行过,还是不行。。。
chestnut 2013-12-24
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
select @dbname=[dbname],@Tsql=[TSQLCommand],@PostTime=[PostTime],@LoginName=[LoginName],@hostname=[hostname] from inserted insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname]) values(@dbname,@Tsql,@PostTime,@LoginName,@hostname) 改成这样试试: insert into 服务器B.testdb.dbo.testdb([dbname],[TSQLCommand],[PostTime],[LoginName],[hostname]) select [dbname],[TSQLCommand],[PostTime],[LoginName],[hostname] from inserted
不行,只要是触发器里边执行的都会报同样的错误,但是单独执行就没错
小魚人 2013-12-24
  • 打赏
  • 举报
回复
跨數據庫的觸發器是要配置分佈式的(兩台的) 你可以用存儲過程實現這個功能 啊

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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