SQL 链接服务器求助!

zaplujean 2008-06-02 09:46:03
有两台机器, 机器A上的触发器Trig_A,触发后通过链接服务器lnk_B插入B中表,触发B上触发器Trig_B,
在Trig_B中通过链接服务器lnk_A插入A中表时出现错误:对远程服务器的访问遭拒绝,因为不存在登录映射。

实际上,lnk_A和lnk_B都配置好可以访问。现在问题流程如图:
A--(Trig_A)-->B--(Trig_B)-->A, 访问A出错

求救!!!

...全文
724 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
waymimi 2010-09-10
  • 打赏
  • 举报
回复
马克一下
utpcb 2008-06-03
  • 打赏
  • 举报
回复
--创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '

--查询示例
select * from ITSV.数据库名.dbo.表名

--导入示例
select * into 表 from ITSV.数据库名.dbo.表名

--以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins '

--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset

--查询示例
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--生成本地表
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--把本地表导入远程表
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表

--更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1

--openquery用法需要创建一个连接

--首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
--查询
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A

--3、opendatasource/openrowset
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from tb
zaplujean 2008-06-03
  • 打赏
  • 举报
回复
如果是简单的A-(LINKSERVER)-〉B的查询、插入等操作,都没有问题
现在问题在于A->B->A
你可以简单做个测试:

1、--创建链接服务器
在服务器A上执行:
exec sp_addlinkedserver 'LNK_B', ' ', 'SQLOLEDB ', 'DRIVER={SQL Server};server=服务器B'
exec sp_addlinkedsrvlogin 'LNK_B', 'false ',null, '用户名', '密码 '
exec sp_serveroption 'LNK_B', 'rpc out','true'
在服务器B上执行:
exec sp_addlinkedserver 'LNK_A', ' ', 'SQLOLEDB ', 'DRIVER={SQL Server};server=服务器A'
exec sp_addlinkedsrvlogin 'LNK_A', 'false ',null, '用户名', '密码 '
exec sp_serveroption 'LNK_A', 'rpc out','true'

2、在服务器B上创建TableB的插入触发器
Create TRIGGER [TBInserted] ON TableB
FOR INSERT
AS
SET NOCOUNT ON
INSERT INTO lnk_A.DB_TEST.dbo.TableC ([F1], [F2]) VALUES ('A','B')
-- 往机器A中插入表TableC,注意单独在查询管理器中运行是没有问题的。

3、在服务器A上执行
Insert into lnk_B.DB_TEST2.dbo.TableB ([F1], [F2]) VALUES ('A','B')
注意此时实际上会触发B上Trigger [TBInserted],从而导致再往A上的表C写入!!
此时出错!
服务器: 消息 7416,级别 16,状态 2,行 1
对远程服务器的访问遭拒绝,因为不存在登录映射。
wzy_love_sly 2008-06-02
  • 打赏
  • 举报
回复
1是查询,2是操作
wzy_love_sly 2008-06-02
  • 打赏
  • 举报
回复
--创建链接服务器 
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '

--查询示例
select * from ITSV.数据库名.dbo.表名

--导入示例
select * into 表 from ITSV.数据库名.dbo.表名

--以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins '

--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset

--查询示例
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--生成本地表
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--把本地表导入远程表
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表

--更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1

--openquery用法需要创建一个连接

--首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
--查询
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A

--3、opendatasource/openrowset
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from tb
wzy_love_sly 2008-06-02
  • 打赏
  • 举报
回复
不同服务器数据库之间的数据操作

--创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '

--查询示例
select * from ITSV.数据库名.dbo.表名

--导入示例
select * into 表 from ITSV.数据库名.dbo.表名

--以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins '

--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset

--查询示例
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--生成本地表
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--把本地表导入远程表
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表

--更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1

--openquery用法需要创建一个连接

--首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
--查询
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A

--3、opendatasource/openrowset
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from


照着做就行
Limpire 2008-06-02
  • 打赏
  • 举报
回复
我这样做是没有问题的:

--创建链接服务器
exec sp_addlinkedserver
@server ='link_name',--链接服务器名
@srvproduct = '',
@provider = N'SQLOLEDB',
@datasrc = N'server_name',--远程服务器名称
@catalog = N'master'
go

--创建远程登录
exec sp_addlinkedsrvlogin
@rmtsrvname = 'link_name',
@useself='false',
@rmtuser = 'sa', --远程服务器登录名称
@rmtpassword = '*****'
go
zaplujean 2008-06-02
  • 打赏
  • 举报
回复
谢谢!
可是错误提示是:
服务器: 消息 7416,级别 16,状态 2,行 1
对远程服务器的访问遭拒绝,因为不存在登录映射。


[Quote=引用 3 楼 Limpire 的回复:]
SQL code1、本地服务器和远程服务器都要启动MSDTC服务

2、触发器封装分布式事务:

create trigger trigger_name
on table_name
for insert,update,delete
as
set xact_abort on --> 必须设置xact_abort on
begin distributed transaction
...
commit tran
set xact_abort off
[/Quote]
zaplujean 2008-06-02
  • 打赏
  • 举报
回复

有两台机器A,B, 已经配置了链接服务器lnk_A和lnk_B互相访问。

我的意图是:
在机器A上的tableA插入一条记录,触发器Trig_A中通过链接服务器lnk_B插入B中表tableB,
从而触发B上触发器Trig_B,在Trig_B中通过链接服务器lnk_A插入A中表TableC。

实际运行时出现错误:对远程服务器的访问遭拒绝,因为不存在登录映射。
经过测试,发现错误出现在Trig_B中通过链接服务器lnk_A插入A中表TableC这一步。

实际上,lnk_A和lnk_B都配置好在查询分析器中可以访问。
现在问题流程似乎变成:

插入机器A上TableA--(触发器Trig_A)-->插入机器B上TableB--(触发器Trig_B)-->插入机器A上TableC, 最后一步出错

谢谢!!

Limpire 2008-06-02
  • 打赏
  • 举报
回复
1、本地服务器和远程服务器都要启动MSDTC服务

2、触发器封装分布式事务:

create trigger trigger_name
on table_name
for insert,update,delete
as
set xact_abort on --> 必须设置xact_abort on
begin distributed transaction
...
commit tran
set xact_abort off
ws_hgo 2008-06-02
  • 打赏
  • 举报
回复
不是很清楚
LZ的意思
能清楚点吗?
ws_hgo 2008-06-02
  • 打赏
  • 举报
回复
sf

22,297

社区成员

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

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