it-swarm.com.de

SQL Linked Server gibt den Fehler "keine Login-Zuordnung vorhanden" aus, wenn ein Konto ohne Administratorberechtigung wird

Ich habe einen lokalen SQL Server 2008R2. Ich habe Linked Server zu einer entfernten Datenbank konfiguriert. 

Der Linked Server funktioniert hervorragend, wenn ich mich mit einem SQL-Login-Konto mit der Serverrolle sysadmin beim lokalen Server anmelde. Ich kann den Remote-Server abfragen, daher weiß ich, dass die Einstellung des Linked Servers korrekt ist. Ich würde jedoch den folgenden Fehler erhalten, wenn ich ein Konto verwende, das nicht die Serverrolle sysadmin hat.

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

Sowohl für lokale als auch für Remote-Server wird die SQL-Anmeldung verwendet (Windows-Authentifizierung wird nicht verwendet).

Welche Art von Sicherheit muss für ein normales SQL-Login-Konto konfiguriert werden, damit Linked Server verwendet werden kann?

11
Tony

Laut diesem Blog muss ich User ID in der Provider-Zeichenfolge angeben, wenn Nicht-Sysadmin-Accounts verwendet werden. Hier ist ein Beispiel. 

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

Das stimmt genau mit dem überein, was ich erlebt habe und löst mein Problem.

UPDATE: Eine alternative Lösung finden Sie in der Antwort von @ Anton's und @ Wouter.

12
Tony

Als alternative Lösung können Sie den Parameter @datasrc anstelle von @provstr ..__ verwenden. @ DataSrc funktioniert ohne die Benutzer-ID

Probe:

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'*****'

Ich habe einen Kommentar hier hinzugefügt, aber er ist nicht sichtbar (weiß nicht warum).

2
Anton R

Nachdem ich damit herumgespielt habe, habe ich festgestellt, dass Sie die User ID-Eigenschaft insgesamt nicht verwenden müssen, indem Sie @datasrc statt @provstr verwenden. Dies ist sehr schlecht dokumentiert, aber das folgende Beispiel funktioniert für mich:

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

Mit dieser Methode können Sie denselben Linked Server für alle Benutzer wiederverwenden. Die derzeit akzeptierte Antwort hat den großen Nachteil, dass Sie einen separaten Verbindungsserver für jeden Benutzer einrichten müssen.

0
Wouter