sql >> Database teknologi >  >> RDS >> Database

Sådan fungerer logins på sammenkædede servere (T-SQL-eksempler)

Når du konfigurerer en forbundet server i SQL Server, kan opsætningen af ​​login nogle gange være forvirrende. I denne artikel sigter jeg mod at give et overblik på højt niveau over, hvordan SQL Server kortlægger lokale logins til fjernlogin på den linkede server.

Når du bruger sp_addlinkedserver for at oprette en linket server i SQL Server, oprettes der automatisk en standardmapping mellem alle logins på den lokale server og eksterne logins på den linkede server. SQL Server bruger legitimationsoplysningerne for det lokale login, når der oprettes forbindelse til den sammenkædede server på vegne af login.

Så hvis dit lokale login har et tilsvarende login på den linkede server, med de samme legitimationsoplysninger, og det har de relevante tilladelser, vil du være i stand til at oprette forbindelse ved hjælp af dit lokale login. Der er ingen grund til at tilføje et login til den linkede server (forudsat at du er glad for at oprette forbindelse ved hjælp af dit eget lokale login).

Men hvis dit lokale login ikke gør det har et tilsvarende login på den linkede server (og med de samme legitimationsoplysninger), vil forbindelsen mislykkes.

I sådanne tilfælde kan du bruge sp_addlinkedsrvlogin at oprette et login til den sammenkædede server, så lokale logins kan oprette forbindelse til den sammenkædede server, selv når de ikke har et tilsvarende login på den sammenkædede server.

At gøre dette kan resultere i, at forskellige brugere bliver brugt på den forbundne server, afhængigt af om de har et tilsvarende login på den forbundne server.

For brugere, der er tilsluttet SQL Server ved hjælp af Windows-godkendelsestilstand, kan SQL Server automatisk bruge Windows-sikkerhedslegitimationsoplysningerne, så længe sikkerhedskontodelegering er tilgængelig på klient- og sendeserveren, og udbyderen understøtter Windows-godkendelsestilstand.

Eksemplerne på denne side bruger SQL Server-logins (de bruger ikke Windows-godkendelsestilstand). Disse eksempler viser de resultater, jeg får, når jeg logger ind på en forbundet server under forskellige scenarier ved hjælp af lokale SQL Server-logins.

Eksempel 1 – Sammenkædet server uden eksplicit login

Først vil jeg oprette en linket server kaldet Homer, men jeg vil ikke oprette nogen tilknyttede logins.

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

Dette opretter automatisk en standardmapping mellem alle logins på den lokale server og eksterne logins på den linkede server.

Nu vil jeg prøve at køre følgende pass-through-forespørgsel mod den linkede server ved hjælp af forskellige lokale logins:

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

Forespørgselsresultater er som følger.

sa

Login mislykkedes for brugeren 'sa'.

Loginoplysninger :Der er et login kaldet 'sa' på begge servere, men de har forskellige adgangskoder. Begge er medlemmer af sysadmin serverrolle.

Lisa

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

Loginoplysninger :Der er et login kaldet 'Lisa' på begge servere, og de har samme adgangskode. Begge er medlemmer af sysadmin server rolle.

Milhouse

Login mislykkedes for brugeren 'Milhouse'.

Loginoplysninger :Dette login er kun på den lokale server. Der er ikke noget tilsvarende login på den tilknyttede server.

Apu

Login mislykkedes for brugeren 'Apu'.

Loginoplysninger :Dette login er kun på den lokale server. Der er ikke noget tilsvarende login på den tilknyttede server.

Eksempel 2 – Tilføj et login til den sammenkædede server

Dernæst opretter jeg et login til den linkede server.

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

Dette login svarer til et login på fjernserveren, så der oprettes en mapping mellem dem.

Nu vil hver bruger køre følgende forespørgsel igen:

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

Forespørgselsresultater er som følger.

sa

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

Loginoplysninger :Der er et login kaldet 'sa' på begge servere, men de har forskellige adgangskoder. Begge er medlemmer af sysadmin serverrolle.

Lisa

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

Loginoplysninger :Der er et login kaldet 'Lisa' på begge servere, og de har samme adgangskode. Begge er medlemmer af sysadmin server rolle.

Milhouse

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

Loginoplysninger :Dette login er kun på den lokale server. Der er ikke noget tilsvarende login på den tilknyttede server.

Apu

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

Loginoplysninger :Dette login er kun på den lokale server. Der er ikke noget tilsvarende login på den tilknyttede server.

Så alle lokale logins var i stand til at oprette forbindelse til den linkede server. Selv de logins, der ikke har et tilsvarende eksternt login på den forbundne server, var i stand til at oprette forbindelse. Dette skyldes, at de alle brugte Maggie-login. Tak Maggie!

Eksempel 3 – Begræns login

Nu vil jeg opdatere login for den linkede server, så den er begrænset til Milhouse.

Men for at gøre dette skal jeg fjerne den linkede server og oprette den igen. Hvis jeg ikke gør dette, vil SQL Server bruge de eksisterende tilknytninger, og jeg får de samme resultater som ovenfor.

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

Så i dette tilfælde bruger jeg @locallogin='Milhouse' (i stedet for @locallogin=NULL ligesom i det foregående eksempel). Dette vil tilføje en login-mapping for kun ét lokalt login (Milhouse).

Hver bruger kører følgende forespørgsel igen:

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

Forespørgselsresultater er som følger.

sa

Besked 18456, niveau 14, tilstand 1, linje 1 Login mislykkedes for brugeren 'sa'.

Loginoplysninger :Der er et login kaldet 'sa' på begge servere, men de har forskellige adgangskoder. Begge er medlemmer af sysadmin serverrolle.

Lisa

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

Loginoplysninger :Der er et login kaldet 'Lisa' på begge servere, og de har samme adgangskode. Begge er medlemmer af sysadmin server rolle.

Milhouse

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

Loginoplysninger :Dette login er kun på den lokale server. Der er ikke noget tilsvarende login på den tilknyttede server.

Apu

Besked 18456, niveau 14, tilstand 1, linje 1 Login mislykkedes for brugeren 'Apu'.

Loginoplysninger :Dette login er kun på den lokale server. Der er ikke noget tilsvarende login på den tilknyttede server.

Så det vigtigste her er, at selv når du begrænser login til kun ét lokalt login, forhindrer det ikke andre lokale logins i at oprette forbindelse til den linkede server. Hvis de har et tilsvarende login på den linkede server, så vil de være i stand til at få adgang til det ved hjælp af deres egen login-mapping, der blev oprettet da sp_addlinkedserver blev kørt.

Eksempel 4 – Begræns det faktisk til kun ét login

Hvis du virkelig kun vil begrænse det til kun ét login og ikke mere, kan du bruge sp_droplinkedsrvlogin for at slette alle login-tilknytninger, der sp_addlinkedserver opretter, før du udfører sp_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';

Lad os nu køre forespørgslen igen med hvert login:

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

Forespørgselsresultater er som følger.

sa

Besked 7416, niveau 16, tilstand 1, linje 1 Adgang til fjernserveren nægtes, fordi der ikke findes nogen login-mapping.

Loginoplysninger :Der er et login kaldet 'sa' på begge servere, men de har forskellige adgangskoder. Begge er medlemmer af sysadmin serverrolle.

Lisa

Besked 7416, niveau 16, tilstand 1, linje 1 Adgang til fjernserveren nægtes, fordi der ikke findes nogen login-mapping.

Loginoplysninger :Der er et login kaldet 'Lisa' på begge servere, og de har samme adgangskode. Begge er medlemmer af sysadmin server rolle.

Milhouse

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

Loginoplysninger :Dette login er kun på den lokale server. Der er ikke noget tilsvarende login på den tilknyttede server.

Apu

Besked 7416, niveau 16, tilstand 1, linje 1 Adgang til fjernserveren nægtes, fordi der ikke findes nogen login-mapping.

Loginoplysninger :Dette login er kun på den lokale server. Der er ikke noget tilsvarende login på den tilknyttede server.

Konfiguration af fjernlogin

En vellykket forbindelse til den linkede server er kun det første trin i processen. Når du er tilsluttet, vil din evne til at gøre ting blive påvirket af tilladelserne for den fjernbruger, som dit login er knyttet til.

For eksempel, hvis Maggie blev oprettet på fjernserveren sådan her:

CREATE LOGIN Maggie WITH PASSWORD ='BigStrong#Passw0rd';BRUG musik;OPRET BRUGER Maggie TIL LOGIN Maggie;GIV SELECT ON DATABASE::Music TO Maggie;

Det eneste hun kan gøre er at køre SELECT udsagn mod 'Musik'-databasen. Derfor vil enhver, der opretter forbindelse til den linkede server ved hjælp af Maggies login, være begrænset til netop det.

Det er god praksis kun at give de nødvendige tilladelser, men ikke mere.

Officiel dokumentation

Denne artikel var beregnet til at give et overblik på højt niveau over, hvordan logins fungerer med linkede servere. Der er masser af andre scenarier, som jeg ikke dækkede her.

Hvis du er interesseret i at lære mere, så tjek følgende links til Microsofts dokumentation:

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

  1. Sæt automatisk nøglegenerering i dvale med MySQL og Oracle

  2. Sorter punkttegn i databasen

  3. Adgang med Microsoft SQL Server – Importer store datasæt ved hjælp af SSIS

  4. Automatisk dataindsamling:Databasefiler og logiske drev i MS SQL Server