При работе с клиентом я столкнулся с ошибкой, связанной с связанным сервером в SQL Server. В этой статье блога я расскажу об ошибке 7416 – “Отказано в доступе к удаленному серверу, потому что не существует сопоставления входа в систему” и предоставлю решение для ее исправления.
Ошибка, связанная с удаленным сервером
Прежде чем приступить к проблеме и ее решению, позвольте мне предоставить некоторые сведения об окружении. В моей лаборатории у меня есть два сервера – SQLSERVER-0 и SQLSERVER-1. Связанный сервер с именем ONE был создан на SQLSERVER-1 для подключения к SQLSERVER-0. Вовлечены две базы данных – SQLDB0 на SQLSERVER-0 и SQLDB1 на SQLSERVER-1.
В то время как связанный сервер работал нормально для простых запросов, хранимая процедура, которая использовала “execute as user”, завершалась с ошибкой. Вот упрощенная версия хранимой процедуры:
CREATE PROCEDURE usp_fetch_data
AS
BEGIN
EXECUTE AS user = 'user_no_login'
SELECT *
FROM One.SQLDB1.dbo.Table_1
REVERT
ENDВыполнение этой хранимой процедуры привело к следующей ошибке:
Msg 7416, Level 16, State 2, Procedure usp_fetch_data, Line 5 [Batch Start Line 10]
Отказано в доступе к удаленному серверу, потому что не существует сопоставления входа в систему.Обходное решение/Решение
При расследовании я обнаружил, что пользователь ‘user_no_login’ не является входом в систему, а является пользователем в базе данных. Создание сопоставления входа в систему для этого пользователя с использованием хранимой процедуры ‘sp_addlinkedsrvlogin’ не сработало и привело к другой ошибке:
Msg 15007, Level 16, State 1, Procedure master.dbo.sp_addlinkedsrvlogin, Line 76 [Batch Start Line 2]
'user_no_login' не является допустимым входом в систему или у вас нет разрешения.После дальнейшего исследования я обнаружил, что мы можем указать идентификатор пользователя в строке подключения, также известной как строка поставщика. Изменяя определение связанного сервера и добавляя параметр “User ID” в строку поставщика, ошибка была устранена. Вот обновленный код:
-- НЕ РАБОТАЕТ
EXEC master.dbo.sp_addlinkedserver @server = N'ONE', @srvproduct=N'SQL', @provider=N'SQLNCLI11', @datasrc=N'SQLSERVER-1', @provstr=N'Data Source=SQLSERVER-1'
-- РАБОТАЕТ (добавлен "User ID" в @provstr)
EXEC master.dbo.sp_addlinkedserver @server = N'ONE', @srvproduct=N'SQL', @provider=N'SQLNCLI11', @datasrc=N'SQLSERVER-1', @provstr=N'Data Source=SQLSERVER-1;User ID=user_no_login'Хотя пользователь ‘user_no_login’ отсутствовал на сервере назначения, передача параметра User ID в строке подключения обошла сообщение об ошибке. Это решение сработало в моем случае, но важно отметить, что оно может не применимо во всех сценариях.
Если у вас возникла подобная ошибка или вы нашли альтернативное решение, я бы хотел услышать об этом. Не стесняйтесь делиться своими опытом в разделе комментариев ниже.