web-dev-qa-db-fra.com

Le serveur lié SQL génère l'erreur "aucun mappage de connexion n'existe" si un compte non-administrateur est utilisé

J'ai un SQL Server 2008R2 local. J'ai configuré le serveur lié sur une base de données distante. 

Le serveur lié fonctionne parfaitement lorsque je me connecte au serveur local à l'aide d'un compte SQL-login avec le rôle de serveur sysadmin. Je peux interroger le serveur distant, donc je sais que le paramètre Serveur lié est correct. Cependant, l'erreur ci-dessous apparaît si j'utilise un compte qui ne possède pas le rôle serveur sysadmin.

Msg 7416, Level 16, State 2, Line 2
Access to the remote server is denied because no login-mapping exists.

La connexion SQL est utilisée pour les serveurs locaux et distants (l'authentification Windows n'est pas utilisée)

Quel type de sécurité dois-je configurer pour un compte SQL-login normal afin d’utiliser le serveur lié?

11
Tony

Selon ce blog , je dois spécifier User ID dans la chaîne du fournisseur si des comptes autres que l'administrateur système sont utilisés. Voici un exemple. 

EXEC master.dbo.sp_addlinkedserver 
    @server = N'MyLinkServerName',
    @provider = N'SQLNCLI',
    @srvproduct = 'SQLNCLI',
    @provstr = N'SERVER=MyServerName\MyInstanceName;User ID=myUser'

Cela correspond exactement à ce que j'ai rencontré et cela résout mon problème.

UPDATE: Voir la réponse de @ Anton's et @ Wouter pour une solution alternative.

12
Tony

Comme solution alternative, vous pouvez utiliser le paramètre @datasrc au lieu de @provstr . @ DataSrc fonctionne sans définir l'ID utilisateur.

Échantillon:

EXEC master.dbo.sp_addlinkedserver @server = N'LinkServerName', @provider=N'SQLNCLI',@srvproduct = 'MS SQL Server', @datasrc=N'serverName\InstanceName' 
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkServerName', @locallogin = NULL , @useself = N'False', @rmtuser = N'myUser', @rmtpassword = N'*****'

J'ai ajouté un commentaire ici aussi, mais ce n'est pas visible (je ne sais pas pourquoi).

2
Anton R

Après avoir joué avec cela, j’ai trouvé que vous pouviez éviter d’utiliser la propriété User ID en utilisant @datasrc au lieu de @provstr. Ceci est très mal documenté, mais l'exemple ci-dessous fonctionne pour moi:

EXEC master.dbo.sp_addlinkedserver
    @server = 'SOME_NAME',
    @srvproduct='', -- needs to be explicitly empty, default is NULL and is not allowed
    @datasrc='some_server.com\SOME_INSTANCE',
    @provider='SQLNCLI';

-- Set up the Linked server to pass along login credentials
EXEC master.dbo.sp_addlinkedsrvlogin
    @rmtsrvname='SOME_NAME',
    @useself='true', -- Optional. This is the default
    @locallogin=NULL; -- Optional. This is the default

En utilisant cette méthode, vous pouvez réutiliser le même serveur lié pour tous vos utilisateurs. La réponse actuellement acceptée présente l’énorme inconvénient que vous devez configurer un serveur lié distinct pour chaque utilisateur.

0
Wouter