我正在尝试根据另一台服务器中的表的列更新一台服务器中的表的列。此代码在同一数据库和服务器中正常工作。我希望我正在更新的表的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'未配置为DATA ACCESS。
使用“exec sp_serveroption'server2','数据访问','true'”这是结果:
消息15247,级别16,状态1,过程sp_server选项,第27行[批处理开始行0]用户无权执行此操作。
看起来是一个我需要了解的权限问题。如果我无法获得这些权限。有下一个最好的选择吗?
您不需要获得使用LinkedServer的sysadmin权限,您只需要求sysadmin执行该语句
exec sp_serveroption 'server2', 'data access', 'true'
除了您拥有连接到server2的凭据之外,您也无法使用openrowset
创建adhoc连接
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]