Při konfiguraci propojeného serveru v SQL Server může být nastavení přihlášení někdy matoucí. V tomto článku se snažím poskytnout přehled na vysoké úrovni, jak SQL Server mapuje místní přihlášení na vzdálená přihlášení na propojeném serveru.
Když používáte sp_addlinkedserver
pro vytvoření propojeného serveru v SQL Server se automaticky vytvoří výchozí mapování mezi všemi přihlášeními na místním serveru a vzdálenými přihlášeními na propojeném serveru. SQL Server používá pověření místního přihlášení při připojování k propojenému serveru jménem přihlášení.
Pokud tedy vaše místní přihlášení má odpovídající přihlašovací údaje na propojeném serveru, se stejnými přihlašovacími údaji a má příslušná oprávnění, budete se moci připojit pomocí místního přihlášení. Není potřeba přidávat přihlašovací údaje pro propojený server (za předpokladu, že se rádi připojujete pomocí vlastního místního přihlášení).
Pokud však vaše místní přihlášení není mít odpovídající přihlášení na propojeném serveru (a se stejnými přihlašovacími údaji), připojení se nezdaří.
V takových případech můžete použít sp_addlinkedsrvlogin
vytvořit přihlašovací údaje pro propojený server, aby se místní přihlášení mohli připojit k propojenému serveru, i když nemají odpovídající přihlašovací údaje na propojeném serveru.
To může mít za následek použití různých uživatelů na propojeném serveru v závislosti na tom, zda mají nebo nemají odpovídající přihlášení na propojeném serveru.
Pro uživatele připojené k serveru SQL Server pomocí režimu ověřování systému Windows může SQL Server automaticky používat pověření zabezpečení systému Windows, pokud je na klientovi a odesílajícím serveru k dispozici delegování účtu zabezpečení a poskytovatel podporuje režim ověřování systému Windows.
Příklady na této stránce používají přihlášení k serveru SQL (nepoužívají režim ověřování Windows). Tyto příklady ukazují výsledky, které získám při přihlašování k propojenému serveru v různých scénářích pomocí lokálních přihlášení k SQL Serveru.
Příklad 1 – Propojený server bez explicitního přihlášení
Nejprve vytvořím propojený server s názvem Homer, ale nevytvořím žádná přidružená přihlášení.
EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music';
Tím se automaticky vytvoří výchozí mapování mezi všemi přihlášeními na místním serveru a vzdálenými přihlášeními na propojeném serveru.
Nyní se pokusím spustit následující průchozí dotaz proti propojenému serveru pomocí různých místních přihlášení:
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER JAKO ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');
Výsledky dotazu jsou následující.
sa
Přihlášení uživatele „sa“ se nezdařilo.
Přihlašovací údaje :Na obou serverech existuje přihlašovací jméno s názvem „sa“, ale mají různá hesla. Oba jsou členy systémového správce role serveru.
Lisa
+----------------+------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| dbo | Lisa |+----------------+------------------+
Přihlašovací údaje :Na obou serverech je přihlašovací jméno s názvem ‚Lisa‘ a mají stejné heslo. Oba jsou členy systémového správce role serveru.
Milhouse
Přihlášení uživatele 'Milhouse' se nezdařilo.
Přihlašovací údaje :Toto přihlášení je pouze na místním serveru. Na propojeném serveru neexistuje žádné odpovídající přihlášení.
Apu
Přihlášení uživatele 'Apu' se nezdařilo.
Přihlašovací údaje :Toto přihlášení je pouze na místním serveru. Na propojeném serveru neexistuje žádné odpovídající přihlášení.
Příklad 2 – Přidání přihlašovacího jména pro propojený server
Dále vytvořím přihlašovací jméno pro propojený server.
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';
Toto přihlášení odpovídá přihlášení na vzdáleném serveru, takže je mezi nimi vytvořeno mapování.
Nyní každý uživatel znovu spustí následující dotaz:
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER JAKO ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');
Výsledky dotazu jsou následující.
sa
+----------------+------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+
Přihlašovací údaje :Na obou serverech existuje přihlašovací jméno s názvem „sa“, ale mají různá hesla. Oba jsou členy systémového správce role serveru.
Lisa
+----------------+------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+
Přihlašovací údaje :Na obou serverech je přihlašovací jméno s názvem ‚Lisa‘ a mají stejné heslo. Oba jsou členy systémového správce role serveru.
Milhouse
+----------------+------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+
Přihlašovací údaje :Toto přihlášení je pouze na místním serveru. Na propojeném serveru neexistuje žádné odpovídající přihlášení.
Apu
+----------------+------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+
Přihlašovací údaje :Toto přihlášení je pouze na místním serveru. Na propojeném serveru neexistuje žádné odpovídající přihlášení.
Všechna místní přihlášení se tedy mohla připojit k propojenému serveru. Dokonce i přihlášení, která nemají odpovídající vzdálené přihlášení na propojeném serveru, se dokázali připojit. Je to proto, že všichni používali přihlášení Maggie. Díky Maggie!
Příklad 3 – Omezení přihlášení
Nyní aktualizuji přihlášení pro propojený server tak, aby bylo omezeno na Milhouse.
Ale abych to mohl udělat, budu muset odstranit propojený server a vytvořit jej znovu. Pokud to neudělám, SQL Server použije existující mapování a dostanu stejné výsledky jako výše.
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';Takže v tomto případě používám
@locallogin='Milhouse'
(místo@locallogin=NULL
jako v předchozím příkladu). Tím se přidá mapování přihlášení pouze pro jedno místní přihlášení (Milhouse).Každý uživatel znovu spustí následující dotaz:
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER JAKO ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');Výsledky dotazu jsou následující.
sa
Zpráva 18456, úroveň 14, stav 1, řádek 1 Přihlášení se nezdařilo pro uživatele 'sa'.Přihlašovací údaje :Na obou serverech existuje přihlašovací jméno s názvem „sa“, ale mají různá hesla. Oba jsou členy systémového správce role serveru.
Lisa
+----------------+------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| dbo | Lisa |+----------------+------------------+Přihlašovací údaje :Na obou serverech je přihlašovací jméno s názvem ‚Lisa‘ a mají stejné heslo. Oba jsou členy systémového správce role serveru.
Milhouse
+----------------+------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+Přihlašovací údaje :Toto přihlášení je pouze na místním serveru. Na propojeném serveru neexistuje žádné odpovídající přihlášení.
Apu
Zpráva 18456, úroveň 14, stav 1, řádek 1 Přihlášení pro uživatele 'Apu' selhalo.Přihlašovací údaje :Toto přihlášení je pouze na místním serveru. Na propojeném serveru neexistuje žádné odpovídající přihlášení.
Klíčové je tedy to, že i když omezíte přihlášení pouze na jedno místní přihlášení, nebrání to dalším místním přihlášením v připojení k propojenému serveru. Pokud mají odpovídající přihlašovací údaje na propojeném serveru, budou k nim moci přistupovat pomocí vlastního mapování přihlášení, které bylo vytvořeno při
sp_addlinkedserver
byl spuštěn.Příklad 4 – Ve skutečnosti omezit pouze na jedno přihlášení
Pokud to opravdu chcete omezit pouze na jedno přihlášení a nic víc, můžete použít
sp_droplinkedsrvlogin
zrušit všechna mapování přihlášení, kterásp_addlinkedserver
vytvoří před spuštěnímsp_addlinkedsrvlogin
.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', @Nrmtpassword='BigStrong#Passw0rd';Nyní spusťte dotaz znovu s každým přihlášením:
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER JAKO ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');Výsledky dotazu jsou následující.
sa
Zpráva 7416, úroveň 16, stav 1, řádek 1 Přístup ke vzdálenému serveru je odepřen, protože neexistuje žádné mapování přihlášení.Přihlašovací údaje :Na obou serverech existuje přihlašovací jméno s názvem „sa“, ale mají různá hesla. Oba jsou členy systémového správce role serveru.
Lisa
Zpráva 7416, úroveň 16, stav 1, řádek 1 Přístup ke vzdálenému serveru je odepřen, protože neexistuje žádné mapování přihlášení.Přihlašovací údaje :Na obou serverech je přihlašovací jméno s názvem ‚Lisa‘ a mají stejné heslo. Oba jsou členy systémového správce role serveru.
Milhouse
+----------------+------------------+| CURRENT_USER | ORIGINAL_LOGIN ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+Přihlašovací údaje :Toto přihlášení je pouze na místním serveru. Na propojeném serveru neexistuje žádné odpovídající přihlášení.
Apu
Zpráva 7416, úroveň 16, stav 1, řádek 1 Přístup ke vzdálenému serveru je odepřen, protože neexistuje žádné mapování přihlášení.Přihlašovací údaje :Toto přihlášení je pouze na místním serveru. Na propojeném serveru neexistuje žádné odpovídající přihlášení.
Konfigurace vzdáleného přihlášení
Úspěšné připojení k propojenému serveru je pouze prvním krokem v procesu. Po připojení bude vaše schopnost dělat věci ovlivněna oprávněními vzdáleného uživatele, ke kterému je namapováno vaše přihlášení.
Například, pokud byla Maggie vytvořena na vzdáleném serveru takto:
VYTVOŘIT PŘIHLÁŠENÍ Maggie POMOCÍ HESLA ='BigStrong#Passw0rd';POUŽÍVEJTE hudbu;VYTVOŘTE UŽIVATELE Maggie PRO PŘIHLÁŠENÍ Maggie;UDĚLENÍ VÝBĚRU V DATABÁZI::Hudba Maggie;Jediné, co může udělat, je spustit
SELECT
prohlášení proti databázi ‚Music‘. Proto každý, kdo se připojí k propojenému serveru pomocí Maggieina přihlášení, bude omezen pouze na toto.Je dobrým zvykem udělit pouze potřebná oprávnění, ale ne více.
Oficiální dokumentace
Účelem tohoto článku je poskytnout přehled na vysoké úrovni o tom, jak fungují přihlášení s propojenými servery. Existuje spousta dalších scénářů, které jsem zde nepopsal.
Pokud se chcete dozvědět více, podívejte se na následující odkazy na dokumentaci společnosti Microsoft:
sp_addlinkedserver
sp_addlinkedsrvlogin
sp_testlinkedserver
-
sp_droplinkedsrvlogin
-
sp_dropserver
OPENQUERY()