根据不同服务器上表的列更新表的列

时间:2019-03-26 12:53:19

标签: sql-server-2017

我正在尝试根据另一台服务器中的表的列来更新一台服务器中的表的列。此代码在相同的数据库和服务器上可以正常工作。我希望我要更新的表的Column1等于另一个表的WHERE,因为第一个表和服务器的Column5与另一个服务器上的另一个表的Column5匹配。

我创建了一个本地服务器组,并在连接到两个服务器组时运行它。我还想念什么?

UPDATE [db1].[schema1].[table1] 
SET [server1].[db1].[schema1].[table1].[Column1] = [server2].[db1].[schema1].[table1].[Column1]
FROM [server1].[db1].[schema1].[table1], [server2].[db1].[schema1].[table1]WHERE [server1].[db1].[schema1].[table1].[Column5] = [server2].[db1].[schema1].[table1].[Column5]

这是错误:

使用“ exec sp_testlinkedserver server2”,结果如下:

server2(userlogin):消息7411,级别16,状态1,过程sp_testlinkedserver,第1行[批处理开始第0行] 服务器“ server2”未配置用于数据访问。

使用“ exec sp_serveroption'server2','data access','true'”,结果如下:

消息15247,级别16,状态1,过程sp_serveroption,第27行[批处理开始第0行] 用户无权执行此操作。

看起来是权限问题,我需要联系一下。如果我无法获得这些权限。还有下一个最佳选择吗?

1 个答案:

答案 0 :(得分:0)

使用LinkedServer不需要获得sysadmin特权,只需让sysadmin执行该语句即可

exec sp_serveroption 'server2', 'data access', 'true'

这也不可能,但是您具有连接到server2的凭据,可以使用openrowset

创建临时连接
  

OPENROWSET权限由用户的权限确定   传递给OLE DB提供程序的名称

UPDATE T1
SET T1.[Column1] = T2.[Column1]
FROM [server1].[db1].[schema1].[table1] T1
JOIN OPENROWSET('SQLNCLI', '<Connection string to Server2>',  
     'SELECT * FROM [db1].[schema1].[table1]') AS T2 ON T1.[Column5] = T2.[Column5]

OpenDataSource

  

任何用户都可以执行OPENDATASOURCE。用于的权限   从连接字符串确定连接到远程服务器

UPDATE T1
    SET T1.[Column1] = T2.[Column1]
    FROM [server1].[db1].[schema1].[table1] T1
    JOIN OPENDATASOURCE('SQLNCLI', '<Connection string to Server2>').[db1].[schema1].[table1] AS T2 ON T1.[Column5] = T2.[Column5]