Database
 sql >> Datenbank >  >> RDS >> Database

Funktionsweise von Anmeldungen auf verknüpften Servern (T-SQL-Beispiele)

Beim Konfigurieren eines Verbindungsservers in SQL Server kann das Einrichten der Anmeldungen manchmal verwirrend sein. In diesem Artikel möchte ich einen groben Überblick darüber geben, wie SQL Server lokale Anmeldungen entfernten Anmeldungen auf dem Verbindungsserver zuordnet.

Wenn Sie sp_addlinkedserver verwenden Um einen Verbindungsserver in SQL Server zu erstellen, wird automatisch eine Standardzuordnung zwischen allen Anmeldungen auf dem lokalen Server und Remoteanmeldungen auf dem Verbindungsserver erstellt. SQL Server verwendet die Anmeldeinformationen des lokalen Anmeldenamens, wenn im Auftrag des Anmeldenamens eine Verbindung zum Verbindungsserver hergestellt wird.

Wenn Ihr lokales Login also ein entsprechendes Login auf dem verknüpften Server mit denselben Anmeldeinformationen hat und es über die entsprechenden Berechtigungen verfügt, können Sie sich mit Ihrem lokalen Login verbinden. Es ist nicht erforderlich, ein Login für den verknüpften Server hinzuzufügen (vorausgesetzt, Sie möchten sich mit Ihrem eigenen lokalen Login verbinden).

Aber wenn Ihr lokaler Login nicht über ein entsprechendes Login auf dem Verbindungsserver (und mit denselben Anmeldeinformationen) verfügen, schlägt die Verbindung fehl.

In solchen Fällen können Sie sp_addlinkedsrvlogin verwenden um eine Anmeldung für den verknüpften Server zu erstellen, sodass lokale Anmeldungen eine Verbindung mit dem verknüpften Server herstellen können, selbst wenn sie keine entsprechende Anmeldung auf dem verknüpften Server haben.

Dies kann dazu führen, dass unterschiedliche Benutzer auf dem verknüpften Server verwendet werden, je nachdem, ob sie über ein entsprechendes Login auf dem verknüpften Server verfügen oder nicht.

Für Benutzer, die über den Windows-Authentifizierungsmodus mit SQL Server verbunden sind, kann SQL Server automatisch die Windows-Sicherheitsanmeldeinformationen verwenden, solange die Delegierung von Sicherheitskonten auf dem Client und dem sendenden Server verfügbar ist und der Anbieter den Windows-Authentifizierungsmodus unterstützt.

Die Beispiele auf dieser Seite verwenden SQL Server-Anmeldungen (sie verwenden keinen Windows-Authentifizierungsmodus). Diese Beispiele zeigen die Ergebnisse, die ich erhalte, wenn ich mich bei einem Verbindungsserver unter verschiedenen Szenarien mit lokalen SQL Server-Anmeldungen anmelde.

Beispiel 1 – Verbundener Server ohne explizite Anmeldung

Zuerst erstelle ich einen verknüpften Server namens Homer, aber ich erstelle keine zugehörigen Logins.

EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music';

Dadurch wird automatisch eine Standardzuordnung zwischen allen Anmeldungen auf dem lokalen Server und Remoteanmeldungen auf dem Verbindungsserver erstellt.

Jetzt werde ich versuchen, die folgende Pass-Through-Abfrage für den Verbindungsserver mit verschiedenen lokalen Anmeldungen auszuführen:

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Die Abfrageergebnisse lauten wie folgt.

sa

Anmeldung für Benutzer 'sa' fehlgeschlagen.

Anmeldedaten :Auf beiden Servern gibt es ein Login namens „sa“, aber sie haben unterschiedliche Passwörter. Beide sind Mitglieder des sysadmin Serverrolle.

Lisa

+----------------+------------------+| AKTUELLER_BENUTZER | ORIGINAL_LOGIN ||----------------+------------------|| dbo | Lisa |+----------------+------------------+

Anmeldedaten :Auf beiden Servern gibt es ein Login namens „Lisa“, und sie haben dasselbe Passwort. Beide sind Mitglieder des sysadmin Serverrolle.

Milhouse

Anmeldung für Benutzer 'Milhouse' fehlgeschlagen.

Anmeldedaten :Diese Anmeldung erfolgt nur auf dem lokalen Server. Auf dem verlinkten Server gibt es kein entsprechendes Login.

Apu

Anmeldung für Benutzer 'Apu' fehlgeschlagen.

Anmeldedaten :Diese Anmeldung erfolgt nur auf dem lokalen Server. Auf dem verlinkten Server gibt es kein entsprechendes Login.

Beispiel 2 – Fügen Sie ein Login für den verknüpften Server hinzu

Als Nächstes erstelle ich ein Login für den verknüpften Server.

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';

Diese Anmeldung entspricht einer Anmeldung auf dem Remote-Server, sodass zwischen ihnen eine Zuordnung erstellt wird.

Jetzt führt jeder Benutzer erneut die folgende Abfrage aus:

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Die Abfrageergebnisse lauten wie folgt.

sa

+----------------+------------------+| AKTUELLER_BENUTZER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Anmeldedaten :Auf beiden Servern gibt es ein Login namens „sa“, aber sie haben unterschiedliche Passwörter. Beide sind Mitglieder des sysadmin Serverrolle.

Lisa

+----------------+------------------+| AKTUELLER_BENUTZER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Anmeldedaten :Auf beiden Servern gibt es ein Login namens „Lisa“, und sie haben dasselbe Passwort. Beide sind Mitglieder des sysadmin Serverrolle.

Milhouse

+----------------+------------------+| AKTUELLER_BENUTZER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Anmeldedaten :Diese Anmeldung erfolgt nur auf dem lokalen Server. Auf dem verlinkten Server gibt es kein entsprechendes Login.

Apu

+----------------+------------------+| AKTUELLER_BENUTZER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Anmeldedaten :Diese Anmeldung erfolgt nur auf dem lokalen Server. Auf dem verlinkten Server gibt es kein entsprechendes Login.

Alle lokalen Anmeldungen konnten sich also mit dem Verbindungsserver verbinden. Sogar die Logins, die kein entsprechendes Remote-Login auf dem verknüpften Server haben, konnten sich verbinden. Das liegt daran, dass sie alle den Maggie-Login verwendet haben. Danke Maggie!

Beispiel 3 – Login einschränken

Jetzt aktualisiere ich die Anmeldung für den Verbindungsserver, sodass sie auf Milhouse beschränkt ist.

Aber dazu muss ich den verknüpften Server entfernen und neu erstellen. Wenn ich dies nicht tue, verwendet SQL Server die vorhandenen Zuordnungen und ich erhalte die gleichen Ergebnisse wie oben.

EXEC sp_dropserver 'Homer', 'droplogins';EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog ='Musik';EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd'; 

In diesem Fall verwende ich also @locallogin='Milhouse' (statt @locallogin=NULL wie im vorigen Beispiel). Dadurch wird eine Anmeldezuordnung für nur eine lokale Anmeldung (Milhouse) hinzugefügt.

Jeder Benutzer führt die folgende Abfrage erneut aus:

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Die Abfrageergebnisse lauten wie folgt.

sa

Msg 18456, Level 14, State 1, Line 1Login für Benutzer „sa“ fehlgeschlagen.

Anmeldedaten :Auf beiden Servern gibt es ein Login namens „sa“, aber sie haben unterschiedliche Passwörter. Beide sind Mitglieder des sysadmin Serverrolle.

Lisa

+----------------+------------------+| AKTUELLER_BENUTZER | ORIGINAL_LOGIN ||----------------+------------------|| dbo | Lisa |+----------------+------------------+

Anmeldedaten :Auf beiden Servern gibt es ein Login namens „Lisa“, und sie haben dasselbe Passwort. Beide sind Mitglieder des sysadmin Serverrolle.

Milhouse

+----------------+------------------+| AKTUELLER_BENUTZER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Anmeldedaten :Diese Anmeldung erfolgt nur auf dem lokalen Server. Auf dem verlinkten Server gibt es kein entsprechendes Login.

Apu

Msg 18456, Level 14, State 1, Line 1Login failed for user 'Apu'.

Anmeldedaten :Diese Anmeldung erfolgt nur auf dem lokalen Server. Auf dem verlinkten Server gibt es kein entsprechendes Login.

Der Schlüssel zum Mitnehmen ist also, dass selbst wenn Sie die Anmeldung auf nur eine lokale Anmeldung beschränken, andere lokale Anmeldungen nicht daran gehindert werden, sich mit dem verknüpften Server zu verbinden. Wenn sie über ein entsprechendes Login auf dem verknüpften Server verfügen, können sie über ihre eigene Login-Zuordnung darauf zugreifen, die beim sp_addlinkedserver erstellt wurde ausgeführt wurde.

Beispiel 4 – Eigentlich auf nur einen Login beschränken

Wenn Sie es wirklich nur auf eine Anmeldung und nicht mehr beschränken möchten, können Sie sp_droplinkedsrvlogin verwenden um alle Anmeldezuordnungen zu löschen, die sp_addlinkedserver erstellt, bevor Sie sp_addlinkedsrvlogin ausführen .

EXEC sp_dropserver 'Homer', 'droplogins';EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog ='Musik';EXEC sp_droplinkedsrvlogin 'Homer', NULL;EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N 'BigStrong#Passw0rd';

Lassen Sie uns nun die Abfrage bei jedem Login erneut ausführen:

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Die Abfrageergebnisse lauten wie folgt.

sa

Msg 7416, Level 16, State 1, Line 1Der Zugriff auf den Remote-Server wird verweigert, da keine Login-Zuordnung vorhanden ist.

Anmeldedaten :Auf beiden Servern gibt es ein Login namens „sa“, aber sie haben unterschiedliche Passwörter. Beide sind Mitglieder des sysadmin Serverrolle.

Lisa

Msg 7416, Level 16, State 1, Line 1Der Zugriff auf den Remote-Server wird verweigert, da keine Login-Zuordnung vorhanden ist.

Anmeldedaten :Auf beiden Servern gibt es ein Login namens „Lisa“, und sie haben dasselbe Passwort. Beide sind Mitglieder des sysadmin Serverrolle.

Milhouse

+----------------+------------------+| AKTUELLER_BENUTZER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Anmeldedaten :Diese Anmeldung erfolgt nur auf dem lokalen Server. Auf dem verlinkten Server gibt es kein entsprechendes Login.

Apu

Msg 7416, Level 16, State 1, Line 1Der Zugriff auf den Remote-Server wird verweigert, da keine Login-Zuordnung vorhanden ist.

Anmeldedaten :Diese Anmeldung erfolgt nur auf dem lokalen Server. Auf dem verlinkten Server gibt es kein entsprechendes Login.

Konfiguration des Remote-Logins

Die erfolgreiche Verbindung mit dem Verbindungsserver ist nur der erste Schritt in diesem Prozess. Sobald die Verbindung hergestellt ist, werden Ihre Möglichkeiten, Dinge zu tun, von den Berechtigungen des Remote-Benutzers beeinflusst, dem Ihr Login zugeordnet ist.

Zum Beispiel, wenn Maggie wie folgt auf dem Remote-Server erstellt wurde:

LOGIN Maggie MIT PASSWORT ERSTELLEN ='BigStrong#Passw0rd';Musik VERWENDEN;BENUTZER Maggie FÜR LOGIN Maggie ERSTELLEN;SELECT ON DATABASE::Music TO Maggie GEWÄHREN;

Sie kann nur SELECT ausführen Aussagen gegen die Datenbank „Musik“. Daher ist jeder, der sich mit Maggies Login mit dem verknüpften Server verbindet, genau darauf beschränkt.

Es hat sich bewährt, nur die erforderlichen Berechtigungen zu erteilen, aber nicht mehr.

Offizielle Dokumentation

Dieser Artikel sollte einen allgemeinen Überblick darüber geben, wie Anmeldungen bei Verbindungsservern funktionieren. Es gibt viele andere Szenarien, die ich hier nicht behandelt habe.

Wenn Sie mehr erfahren möchten, sehen Sie sich die folgenden Links zur Microsoft-Dokumentation an:

  • sp_addlinkedserver
  • sp_addlinkedsrvlogin
  • sp_testlinkedserver
  • sp_droplinkedsrvlogin
  • sp_dropserver
  • OPENQUERY()