sql >> Database >  >> RDS >> Database

Hoe aanmeldingen werken op gekoppelde servers (T-SQL-voorbeelden)

Bij het configureren van een gekoppelde server in SQL Server kan het instellen van de logins soms verwarrend zijn. In dit artikel wil ik een algemeen overzicht geven van hoe SQL Server lokale aanmeldingen toewijst aan aanmeldingen op afstand op de gekoppelde server.

Wanneer u sp_addlinkedserver . gebruikt om een ​​gekoppelde server in SQL Server te maken, wordt automatisch een standaardtoewijzing gemaakt tussen alle aanmeldingen op de lokale server en aanmeldingen op afstand op de gekoppelde server. SQL Server gebruikt de referenties van de lokale login bij het verbinden met de gekoppelde server namens de login.

Dus als uw lokale login een corresponderende login heeft op de gekoppelde server, met dezelfde inloggegevens, en het heeft de juiste machtigingen, dan kunt u verbinding maken met uw lokale login. Het is niet nodig om een ​​login voor de gekoppelde server toe te voegen (ervan uitgaande dat u graag verbinding maakt met uw eigen lokale login).

Maar als uw lokale login niet een overeenkomstige login hebben op de gekoppelde server (en met dezelfde inloggegevens), zal de verbinding mislukken.

In dergelijke gevallen kunt u sp_addlinkedsrvlogin . gebruiken om een ​​login voor de gekoppelde server aan te maken, zodat lokale logins verbinding kunnen maken met de gekoppelde server, zelfs als ze geen overeenkomstige login hebben op de gekoppelde server.

Als u dit doet, kan dit ertoe leiden dat verschillende gebruikers op de gekoppelde server worden gebruikt, afhankelijk van het al dan niet hebben van een overeenkomstige login op de gekoppelde server.

Voor gebruikers die zijn verbonden met SQL Server via de Windows-verificatiemodus, kan SQL Server automatisch de Windows-beveiligingsreferenties gebruiken zolang beveiligingsaccountdelegatie beschikbaar is op de client en de verzendende server en de provider de Windows-verificatiemodus ondersteunt.

De voorbeelden op deze pagina gebruiken SQL Server-aanmeldingen (ze gebruiken geen Windows-verificatiemodus). Deze voorbeelden tonen de resultaten die ik krijg als ik inlog op een gekoppelde server onder verschillende scenario's met lokale SQL Server-aanmeldingen.

Voorbeeld 1 – Gelinkte server zonder expliciete login

Eerst maak ik een gekoppelde server met de naam Homer, maar ik zal geen bijbehorende logins maken.

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

Hiermee wordt automatisch een standaardtoewijzing gemaakt tussen alle aanmeldingen op de lokale server en aanmeldingen op afstand op de gekoppelde server.

Nu zal ik proberen de volgende pass-through-query uit te voeren op de gekoppelde server met behulp van verschillende lokale logins:

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

De resultaten van de zoekopdracht zijn als volgt.

sa

Login failed for user 'sa'.

Inloggegevens :Er is een login genaamd 'sa' op beide servers, maar ze hebben verschillende wachtwoorden. Beiden zijn lid van de sysadmin serverrol.

Lisa

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| dbo            | Lisa             |
+----------------+------------------+

Inloggegevens :Er is een login genaamd 'Lisa' op beide servers en ze hebben hetzelfde wachtwoord. Beiden zijn lid van de sysadmin server rol.

Milhouse

Login failed for user 'Milhouse'.

Inloggegevens :Deze login is alleen op de lokale server. Er is geen overeenkomstige login op de gekoppelde server.

Apu

Login failed for user 'Apu'.

Inloggegevens :Deze login is alleen op de lokale server. Er is geen overeenkomstige login op de gekoppelde server.

Voorbeeld 2 – Voeg een login toe voor de gekoppelde server

Vervolgens maak ik een login aan voor de gekoppelde server.

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

Deze login komt overeen met een login op de externe server, dus er wordt een mapping tussen gemaakt.

Nu zal elke gebruiker de volgende query opnieuw uitvoeren:

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

De resultaten van de zoekopdracht zijn als volgt.

sa

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

Inloggegevens :Er is een login genaamd 'sa' op beide servers, maar ze hebben verschillende wachtwoorden. Beiden zijn lid van de sysadmin serverrol.

Lisa

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

Inloggegevens :Er is een login genaamd 'Lisa' op beide servers en ze hebben hetzelfde wachtwoord. Beiden zijn lid van de sysadmin server rol.

Milhouse

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

Inloggegevens :Deze login is alleen op de lokale server. Er is geen overeenkomstige login op de gekoppelde server.

Apu

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

Inloggegevens :Deze login is alleen op de lokale server. Er is geen overeenkomstige login op de gekoppelde server.

Dus alle lokale logins konden verbinding maken met de gekoppelde server. Zelfs de aanmeldingen die geen overeenkomstige externe aanmelding op de gekoppelde server hebben, konden verbinding maken. Dit komt omdat ze allemaal de Maggie-login gebruikten. Bedankt Maggie!

Voorbeeld 3 – Beperk de login

Nu zal ik de login voor de gekoppelde server bijwerken, zodat deze beperkt is tot Milhouse.

Maar om dit te doen, moet ik de gekoppelde server verwijderen en opnieuw maken. Als ik dit niet doe, gebruikt SQL Server de bestaande toewijzingen en krijg ik dezelfde resultaten als hierboven.

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

Dus in dit geval gebruik ik @locallogin='Milhouse' (in plaats van @locallogin=NULL zoals in het vorige voorbeeld). Dit voegt een login-toewijzing toe voor slechts één lokale login (Milhouse).

Elke gebruiker voert de volgende query opnieuw uit:

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

De resultaten van de zoekopdracht zijn als volgt.

sa

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

Inloggegevens :Er is een login genaamd 'sa' op beide servers, maar ze hebben verschillende wachtwoorden. Beiden zijn lid van de sysadmin serverrol.

Lisa

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| dbo            | Lisa             |
+----------------+------------------+

Inloggegevens :Er is een login genaamd 'Lisa' op beide servers en ze hebben hetzelfde wachtwoord. Beiden zijn lid van de sysadmin server rol.

Milhouse

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

Inloggegevens :Deze login is alleen op de lokale server. Er is geen overeenkomstige login op de gekoppelde server.

Apu

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

Inloggegevens :Deze login is alleen op de lokale server. Er is geen overeenkomstige login op de gekoppelde server.

Dus de belangrijkste afhaalmogelijkheid hier is dat, zelfs wanneer u de login beperkt tot slechts één lokale login, dit niet verhindert dat andere lokale logins verbinding maken met de gekoppelde server. Als ze een overeenkomstige login hebben op de gekoppelde server, kunnen ze deze openen met behulp van hun eigen login-toewijzing die is gemaakt toen sp_addlinkedserver werd uitgevoerd.

Voorbeeld 4 – Beperk het eigenlijk tot slechts één login

Als je het echt wilt beperken tot slechts één login en niet meer, kun je sp_droplinkedsrvlogin gebruiken om alle login-toewijzingen te verwijderen die sp_addlinkedserver maakt voordat u sp_addlinkedsrvlogin . uitvoert .

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_droplinkedsrvlogin 'Homer', NULL;

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

Laten we de query nu opnieuw uitvoeren bij elke login:

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

De resultaten van de zoekopdracht zijn als volgt.

sa

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

Inloggegevens :Er is een login genaamd 'sa' op beide servers, maar ze hebben verschillende wachtwoorden. Beiden zijn lid van de sysadmin serverrol.

Lisa

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

Inloggegevens :Er is een login genaamd 'Lisa' op beide servers en ze hebben hetzelfde wachtwoord. Beiden zijn lid van de sysadmin server rol.

Milhouse

+----------------+------------------+
| CURRENT_USER   | ORIGINAL_LOGIN   |
|----------------+------------------|
| Maggie         | Maggie           |
+----------------+------------------+

Inloggegevens :Deze login is alleen op de lokale server. Er is geen overeenkomstige login op de gekoppelde server.

Apu

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

Inloggegevens :Deze login is alleen op de lokale server. Er is geen overeenkomstige login op de gekoppelde server.

Configuratie van inloggen op afstand

Het succesvol verbinden met de gekoppelde server is slechts de eerste stap in het proces. Eenmaal verbonden, wordt uw vermogen om dingen te doen beïnvloed door de machtigingen van de externe gebruiker waaraan uw login is toegewezen.

Als Maggie bijvoorbeeld als volgt op de externe server is gemaakt:

CREATE LOGIN Maggie
    WITH PASSWORD = 'BigStrong#Passw0rd';

USE Music;
CREATE USER Maggie FOR LOGIN Maggie;

GRANT SELECT ON DATABASE::Music TO Maggie;

Het enige wat ze kan doen is SELECT . uitvoeren verklaringen tegen de databank ‘Muziek’. Daarom is iedereen die verbinding maakt met de gekoppelde server met behulp van Maggie's login daartoe beperkt.

Het is een goede gewoonte om alleen de vereiste machtigingen te verlenen, maar niet meer.

Officiële documentatie

Dit artikel was bedoeld om een ​​algemeen overzicht te geven van hoe aanmeldingen werken met gekoppelde servers. Er zijn tal van andere scenario's die ik hier niet heb behandeld.

Als je meer wilt weten, bekijk dan de volgende links naar de documentatie van Microsoft:

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

  1. PostgreSQL- en TimescaleDB-back-upherstel met ClusterControl CLI

  2. 4 manieren om de tijdzone in Oracle te wijzigen

  3. Werk rijen in de ene tabel bij met gegevens uit een andere tabel op basis van een kolom in elke tabel die gelijk is

  4. MariaDB Enterprise Backup vergelijken met ClusterControl Backup Management