Обновление столбца таблицы на основе столбцов таблицы на другом сервере - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь обновить столбец таблицы на одном сервере на основе столбцов таблицы на другом сервере.Этот код прекрасно работает в той же базе данных и на сервере.Я хочу, чтобы Column1 таблицы, которую я обновлял, равнялся столбцу другой таблицы. ГДЕ 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): Msg 7411, Уровень 16, Состояние 1, Процедура sp_testlinkedserver, Строка 1 [Пакетная строка запуска 0] Сервер 'server2' не настроен для доступа к данным.

С "exec sp_serveroption" server2 "," доступ к данным ","true '"это результат:

Сообщение 15247, Уровень 16, Состояние 1, Процедура sp_serveroption, Строка 27 [Стартовая строка запуска 0] У пользователя нет разрешения на выполнение этого действия.

Похоже, проблема с разрешением, о которой мне нужно будет поговорить.Если я не могу получить эти разрешения.Есть ли следующий лучший вариант?

1 Ответ

0 голосов
/ 27 марта 2019

Вам не нужно получать привилегии sysadmin для использования LinkedServer, вам нужно только попросить sysadmin выполнить инструкцию

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

Это также невозможно, но у вас есть учетные данные для подключения к server2, вы можете создать соединение adhoc, используя 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]
...