När du konfigurerar en länkad server i SQL Server kan det ibland vara förvirrande att konfigurera inloggningarna. I den här artikeln syftar jag till att ge en översikt på hög nivå av hur SQL Server mappar lokala inloggningar till fjärrinloggningar på den länkade servern.
När du använder sp_addlinkedserver
för att skapa en länkad server i SQL Server skapas automatiskt en standardmappning mellan alla inloggningar på den lokala servern och fjärrinloggningar på den länkade servern. SQL Server använder inloggningsuppgifterna för den lokala inloggningen när den ansluter till den länkade servern för inloggningens räkning.
Så om din lokala inloggning har en motsvarande inloggning på den länkade servern, med samma referenser, och den har lämpliga behörigheter, kommer du att kunna ansluta med din lokala inloggning. Det finns inget behov av att lägga till en inloggning för den länkade servern (förutsatt att du är glad att ansluta med din egen lokala inloggning).
Men om din lokala inloggning inte gör det har en motsvarande inloggning på den länkade servern (och med samma referenser), kommer anslutningen att misslyckas.
I sådana fall kan du använda sp_addlinkedsrvlogin
för att skapa en inloggning för den länkade servern så att lokala inloggningar kan ansluta till den länkade servern även när de inte har en motsvarande inloggning på den länkade servern.
Att göra detta kan leda till att olika användare används på den länkade servern, beroende på om de har en motsvarande inloggning på den länkade servern eller inte.
För användare som är anslutna till SQL Server med Windows-autentiseringsläge kan SQL Server automatiskt använda Windows-säkerhetsuppgifterna så länge som säkerhetskontodelegering är tillgänglig på klient- och sändningsservern, och leverantören stöder Windows-autentiseringsläge.
Exemplen på den här sidan använder SQL Server-inloggningar (de använder inte Windows-autentiseringsläge). Dessa exempel visar resultaten jag får när jag loggar in på en länkad server under olika scenarier med lokala SQL Server-inloggningar.
Exempel 1 – Länkad server utan explicit inloggning
Först skapar jag en länkad server som heter Homer, men jag kommer inte att skapa några associerade inloggningar.
EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music';
Detta skapar automatiskt en standardmappning mellan alla inloggningar på den lokala servern och fjärrinloggningar på den länkade servern.
Nu ska jag försöka köra följande pass-through-fråga mot den länkade servern med hjälp av olika lokala inloggningar:
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');
Frågeresultaten är som följer.
sa
Inloggning misslyckades för användaren 'sa'.
Inloggningsinformation :Det finns en inloggning som heter 'sa' på båda servrarna, men de har olika lösenord. Båda är medlemmar i sysadmin serverroll.
Lisa
+----------------+------------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| dbo | Lisa |+----------------+------------------------+
Inloggningsinformation :Det finns en inloggning som heter "Lisa" på båda servrarna, och de har samma lösenord. Båda är medlemmar i sysadmin serverroll.
Milhouse
Inloggning misslyckades för användaren 'Milhouse'.
Inloggningsinformation :Denna inloggning är endast på den lokala servern. Det finns ingen motsvarande inloggning på den länkade servern.
Apu
Inloggning misslyckades för användaren 'Apu'.
Inloggningsinformation :Denna inloggning är endast på den lokala servern. Det finns ingen motsvarande inloggning på den länkade servern.
Exempel 2 – Lägg till en inloggning för den länkade servern
Därefter skapar jag en inloggning för den länkade servern.
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';
Denna inloggning motsvarar en inloggning på fjärrservern, så en mappning skapas mellan dem.
Nu kommer varje användare att köra följande fråga igen:
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');
Frågeresultaten är som följer.
sa
+----------------+------------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------------+
Inloggningsinformation :Det finns en inloggning som heter 'sa' på båda servrarna, men de har olika lösenord. Båda är medlemmar i sysadmin serverroll.
Lisa
+----------------+------------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------------+
Inloggningsinformation :Det finns en inloggning som heter "Lisa" på båda servrarna, och de har samma lösenord. Båda är medlemmar i sysadmin serverroll.
Milhouse
+----------------+------------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------------+
Inloggningsinformation :Denna inloggning är endast på den lokala servern. Det finns ingen motsvarande inloggning på den länkade servern.
Apu
+----------------+------------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------------+
Inloggningsinformation :Denna inloggning är endast på den lokala servern. Det finns ingen motsvarande inloggning på den länkade servern.
Så alla lokala inloggningar kunde ansluta till den länkade servern. Även de inloggningar som inte har en motsvarande fjärrinloggning på den länkade servern kunde ansluta. Detta beror på att de alla använde Maggie-inloggningen. Tack Maggie!
Exempel 3 – Begränsa inloggningen
Nu ska jag uppdatera inloggningen för den länkade servern så att den är begränsad till Milhouse.
Men för att göra detta måste jag ta bort den länkade servern och skapa den igen. Om jag inte gör detta kommer SQL Server att använda de befintliga mappningarna och jag får samma resultat som ovan.
EXEC sp_dropserver 'Homer', 'droplogins';EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog ='Music';EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';Så i det här fallet använder jag
@locallogin='Milhouse'
(istället för@locallogin=NULL
som i föregående exempel). Detta kommer att lägga till en inloggningsmappning för bara en lokal inloggning (Milhouse).Varje användare kör följande fråga igen:
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');Frågeresultaten är som följer.
sa
Msg 18456, Level 14, State 1, Line 1 Inloggning misslyckades för användaren 'sa'.Inloggningsinformation :Det finns en inloggning som heter 'sa' på båda servrarna, men de har olika lösenord. Båda är medlemmar i sysadmin serverroll.
Lisa
+----------------+------------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| dbo | Lisa |+----------------+------------------------+Inloggningsinformation :Det finns en inloggning som heter "Lisa" på båda servrarna, och de har samma lösenord. Båda är medlemmar i sysadmin serverroll.
Milhouse
+----------------+------------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------------+Inloggningsinformation :Denna inloggning är endast på den lokala servern. Det finns ingen motsvarande inloggning på den länkade servern.
Apu
Msg 18456, Level 14, State 1, Line 1 Inloggning misslyckades för användaren 'Apu'.Inloggningsinformation :Denna inloggning är endast på den lokala servern. Det finns ingen motsvarande inloggning på den länkade servern.
Så det viktigaste här är att även när du begränsar inloggningen till bara en lokal inloggning, hindrar det inte andra lokala inloggningar från att ansluta till den länkade servern. Om de har en motsvarande inloggning på den länkade servern kommer de att kunna komma åt den med sin egen inloggningsmappning som skapades när
sp_addlinkedserver
kördes.Exempel 4 – Begränsa det faktiskt till bara en inloggning
Om du verkligen bara vill begränsa det till bara en inloggning och inte mer, kan du använda
sp_droplinkedsrvlogin
för att ta bort alla inloggningsmappningar somsp_addlinkedserver
skapar innan du körsp_addlinkedsrvlogin
.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';Låt oss nu köra frågan igen med varje inloggning:
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');Frågeresultaten är som följer.
sa
Medd. 7416, nivå 16, tillstånd 1, rad 1 Åtkomst till fjärrservern nekas eftersom det inte finns någon inloggningsmappning.Inloggningsinformation :Det finns en inloggning som heter 'sa' på båda servrarna, men de har olika lösenord. Båda är medlemmar i sysadmin serverroll.
Lisa
Medd. 7416, nivå 16, tillstånd 1, rad 1 Åtkomst till fjärrservern nekas eftersom det inte finns någon inloggningsmappning.Inloggningsinformation :Det finns en inloggning som heter "Lisa" på båda servrarna, och de har samma lösenord. Båda är medlemmar i sysadmin serverroll.
Milhouse
+----------------+------------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------------+Inloggningsinformation :Denna inloggning är endast på den lokala servern. Det finns ingen motsvarande inloggning på den länkade servern.
Apu
Medd. 7416, nivå 16, tillstånd 1, rad 1 Åtkomst till fjärrservern nekas eftersom det inte finns någon inloggningsmappning.Inloggningsinformation :Denna inloggning är endast på den lokala servern. Det finns ingen motsvarande inloggning på den länkade servern.
Konfiguration av fjärrinloggning
Att framgångsrikt ansluta till den länkade servern är bara det första steget i processen. När du är ansluten kommer din förmåga att göra saker att påverkas av behörigheterna för fjärranvändaren som din inloggning är mappad till.
Till exempel, om Maggie skapades på fjärrservern så här:
SKAPA LOGGA IN Maggie MED LÖSENORD ='BigStrong#Passw0rd';ANVÄND musik;SKAPA ANVÄNDARE Maggie FÖR LOGGA IN Maggie;BEHANDLA VAL PÅ DATABAS::Musik TILL Maggie;Allt hon kan göra är att köra
SELECT
uttalanden mot databasen "Musik". Därför kommer alla som ansluter till den länkade servern med Maggies inloggning att vara begränsade till just det.Det är bra att bara ge de behörigheter som krävs, men inte mer.
Officiell dokumentation
Den här artikeln var avsedd att ge en översikt på hög nivå av hur inloggningar fungerar med länkade servrar. Det finns många andra scenarier som jag inte täckte här.
Om du är intresserad av att lära dig mer, kolla in följande länkar till Microsofts dokumentation:
sp_addlinkedserver
sp_addlinkedsrvlogin
sp_testlinkedserver
-
sp_droplinkedsrvlogin
-
sp_dropserver
OPENQUERY()