Когато конфигурирате свързан сървър в SQL Server, настройката на данните за влизане понякога може да бъде объркваща. В тази статия се стремя да дам общ преглед на високо ниво на това как SQL Server съпоставя локални данни за влизане към отдалечени влизания на свързания сървър.
Когато използвате sp_addlinkedserver
за да създадете свързан сървър в SQL Server, автоматично се създава съпоставяне по подразбиране между всички входове на локалния сървър и отдалечени входове на свързания сървър. SQL Server използва идентификационните данни на локалния вход, когато се свързва към свързания сървър от името на входа.
Така че, ако вашето локално влизане има съответни данни за вход на свързания сървър, със същите идентификационни данни и има съответните разрешения, ще можете да се свържете, като използвате вашето локално влизане. Не е необходимо да добавяте потребителско име за свързания сървър (ако приемем, че сте щастливи да се свържете, като използвате собственото си локално вход).
Но ако вашето локално влизане не ако имате съответното име за вход на свързания сървър (и със същите идентификационни данни), връзката няма да бъде успешна.
В такива случаи можете да използвате sp_addlinkedsrvlogin
за да създадете потребителско име за свързания сървър, така че локалните потребители да могат да се свързват към свързания сървър, дори когато нямат съответни данни за вход на свързания сървър.
Това може да доведе до използване на различни потребители на свързания сървър, в зависимост от това дали имат или не съответстващо потребителско име на свързания сървър.
За потребители, свързани към SQL Server с помощта на режим на удостоверяване на Windows, SQL Server може автоматично да използва идентификационните данни за защита на Windows, стига делегирането на акаунт за защита е налично на клиента и изпращащия сървър и доставчикът поддържа режим на удостоверяване на Windows.
Примерите на тази страница използват данни за вход в SQL Server (те не използват режим на удостоверяване на Windows). Тези примери показват резултатите, които получавам, когато влизам в свързан сървър при различни сценарии, използвайки локални данни за вход в SQL Server.
Пример 1 – Свързан сървър без изрично влизане
Първо ще създам свързан сървър, наречен Homer, но няма да създавам никакви свързани данни за влизане.
EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music';
Това автоматично създава съпоставяне по подразбиране между всички входове на локалния сървър и отдалечените влизания на свързания сървър.
Сега ще се опитам да изпълня следната преходна заявка срещу свързания сървър, използвайки различни локални данни за влизане:
SELECT * FROM OPENQUERY( Хомър, 'ИЗБЕРЕТЕ CURRENT_USER КАТО ''CURRENT_USER'', ORIGINAL_LOGIN() КАТО ''ORIGINAL_LOGIN''');
Резултатите от заявката са както следва.
sa
Неуспешно влизане за потребител 'sa'.
Подробности за вход :И на двата сървъра има вход, наречен „sa“, но те имат различни пароли. И двамата са членове на сисадмина роля на сървъра.
Лиза
+----------------+-----------------+| CURRENT_USER | ОРИГИНАЛЕН_ВХОД ||----------------+------------------|| dbo | Лиза |+----------------+----------------+
Подробности за вход :И на двата сървъра има вход, наречен „Lisa“, и те имат една и съща парола. И двамата са членове на сисадмина роля на сървъра.
Милхаус
Неуспешно влизане за потребител 'Milhouse'.
Подробности за вход :Това влизане е само на локалния сървър. На свързания сървър няма съответен вход.
Apu
Неуспешно влизане за потребител 'Apu'.
Подробности за вход :Това влизане е само на локалния сървър. На свързания сървър няма съответен вход.
Пример 2 – Добавяне на вход за свързания сървър
След това ще създам вход за свързания сървър.
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';
Това влизане съответства на вход на отдалечения сървър, така че между тях се създава съпоставяне.
Сега всеки потребител ще изпълни отново следната заявка:
SELECT * FROM OPENQUERY( Хомър, 'ИЗБЕРЕТЕ CURRENT_USER КАТО ''CURRENT_USER'', ORIGINAL_LOGIN() КАТО ''ORIGINAL_LOGIN''');
Резултатите от заявката са както следва.
sa
+----------------+-----------------+| CURRENT_USER | ОРИГИНАЛЕН_ВХОД ||----------------+------------------|| Маги | Маги |+----------------+----------------+
Подробности за вход :И на двата сървъра има вход, наречен „sa“, но те имат различни пароли. И двамата са членове на сисадмина роля на сървъра.
Лиза
+----------------+-----------------+| CURRENT_USER | ОРИГИНАЛЕН_ВХОД ||----------------+------------------|| Маги | Маги |+----------------+----------------+
Подробности за вход :И на двата сървъра има вход, наречен „Lisa“, и те имат една и съща парола. И двамата са членове на сисадмина роля на сървъра.
Милхаус
+----------------+-----------------+| CURRENT_USER | ОРИГИНАЛЕН_ВХОД ||----------------+------------------|| Маги | Маги |+----------------+----------------+
Подробности за вход :Това влизане е само на локалния сървър. На свързания сървър няма съответен вход.
Apu
+----------------+-----------------+| CURRENT_USER | ОРИГИНАЛЕН_ВХОД ||----------------+------------------|| Маги | Маги |+----------------+----------------+
Подробности за вход :Това влизане е само на локалния сървър. На свързания сървър няма съответен вход.
Така че всички локални влизания успяха да се свържат към свързания сървър. Дори данните за влизане, които нямат съответно отдалечено влизане на свързания сървър, успяха да се свържат. Това е така, защото всички са използвали регистрацията на Maggie. Благодаря, Маги!
Пример 3 – Ограничаване на влизането
Сега ще актуализирам данните за вход за свързания сървър, така че да е ограничено до Milhouse.
Но за да направя това, ще трябва да премахна свързания сървър и да го създам отново. Ако не направя това, SQL Server ще използва съществуващите съпоставяния и ще получа същите резултати, както по-горе.
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';предварително>Така че в този случай използвам
@locallogin='Milhouse'
(вместо@locallogin=NULL
като в предишния пример). Това ще добави карта за влизане само за едно локално влизане (Milhouse).Всеки потребител изпълнява отново следната заявка:
SELECT * FROM OPENQUERY( Хомър, 'ИЗБЕРЕТЕ CURRENT_USER КАТО ''CURRENT_USER'', ORIGINAL_LOGIN() КАТО ''ORIGINAL_LOGIN''');Резултатите от заявката са както следва.
sa
Съобщение 18456, ниво 14, състояние 1, ред 1 Влизането не бе успешно за потребител „sa“.Подробности за вход :И на двата сървъра има вход, наречен „sa“, но те имат различни пароли. И двамата са членове на сисадмина роля на сървъра.
Лиза
+----------------+-----------------+| CURRENT_USER | ОРИГИНАЛЕН_ВХОД ||----------------+------------------|| dbo | Лиза |+----------------+----------------+Подробности за вход :И на двата сървъра има вход, наречен „Lisa“, и те имат една и съща парола. И двамата са членове на сисадмина роля на сървъра.
Милхаус
+----------------+-----------------+| CURRENT_USER | ОРИГИНАЛЕН_ВХОД ||----------------+------------------|| Маги | Маги |+----------------+----------------+Подробности за вход :Това влизане е само на локалния сървър. На свързания сървър няма съответен вход.
Apu
Съобщение 18456, ниво 14, състояние 1, ред 1 Влизането не бе успешно за потребител „Apu“.Подробности за вход :Това влизане е само на локалния сървър. На свързания сървър няма съответен вход.
Така че основният извод тук е, че дори когато ограничите влизането само до едно локално влизане, това не пречи на други локални входове да се свързват към свързания сървър. Ако имат съответни данни за вход на свързания сървър, тогава те ще могат да осъществят достъп до него, като използват собствената си карта за вход, която е създадена, когато
sp_addlinkedserver
беше стартиран.Пример 4 – Ограничете го само до едно влизане
Ако наистина искате да го ограничите само до едно влизане и не повече, можете да използвате
sp_droplinkedsrvlogin
за да премахнете всички съпоставяния за влизане, коитоsp_addlinkedserver
създава преди да изпълните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. ='Music';EXEC sp_droplinkedsrvlogin 'Homer', NULL;EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'N'Maggie', 'BigStrong#Passw0rd';Сега нека стартираме заявката още веднъж с всяко влизане:
SELECT * FROM OPENQUERY( Хомър, 'ИЗБЕРЕТЕ CURRENT_USER КАТО ''CURRENT_USER'', ORIGINAL_LOGIN() КАТО ''ORIGINAL_LOGIN''');Резултатите от заявката са както следва.
sa
Съобщение 7416, ниво 16, състояние 1, ред 1 Достъпът до отдалечения сървър е отказан, тъй като не съществува съпоставяне за вход.Подробности за вход :И на двата сървъра има вход, наречен „sa“, но те имат различни пароли. И двамата са членове на сисадмина роля на сървъра.
Лиза
Съобщение 7416, ниво 16, състояние 1, ред 1 Достъпът до отдалечения сървър е отказан, тъй като не съществува съпоставяне за вход.Подробности за вход :И на двата сървъра има вход, наречен „Lisa“, и те имат една и съща парола. И двамата са членове на сисадмина роля на сървъра.
Милхаус
+----------------+-----------------+| CURRENT_USER | ОРИГИНАЛЕН_ВХОД ||----------------+------------------|| Маги | Маги |+----------------+----------------+Подробности за вход :Това влизане е само на локалния сървър. На свързания сървър няма съответен вход.
Apu
Съобщение 7416, ниво 16, състояние 1, ред 1 Достъпът до отдалечения сървър е отказан, тъй като не съществува съпоставяне за вход.Подробности за вход :Това влизане е само на локалния сървър. На свързания сървър няма съответен вход.
Конфигуриране на отдалеченото влизане
Успешното свързване към свързания сървър е само първата стъпка в процеса. След като се свържете, способността ви да правите неща ще бъде повлияна от разрешенията на отдалечения потребител, към който е съпоставено вашето влизане.
Например, ако Maggie е създадена на отдалечения сървър по следния начин:
СЪЗДАВАНЕ НА ВХОД Maggie С ПАРОЛА ='BigStrong#Passw0rd';ИЗПОЛЗВАНЕ на музика;СЪЗДАВАНЕ НА ПОТРЕБИТЕЛ Maggie ЗА ВХОД Maggie;ПРЕДОСТАВЯ ИЗБОР НА БАЗА ДАННИ::Music TO Maggie;Всичко, което може да направи, е да стартира
SELECT
изявления срещу базата данни „Музика“. Следователно всеки, който се свързва със свързания сървър, използвайки данните за вход на Maggie, ще бъде ограничен само до това.Добра практика е да се предоставят само необходимите разрешения, но не повече.
Официална документация
Тази статия имаше за цел да предостави преглед на високо ниво за това как влизането работи със свързани сървъри. Има много други сценарии, които не разгледах тук.
Ако се интересувате да научите повече, вижте следните връзки към документацията на Microsoft:
sp_addlinkedserver
sp_addlinkedsrvlogin
sp_testlinkedserver
-
sp_droplinkedsrvlogin
-
sp_dropserver
OPENQUERY()