W tym artykule tworzę login do połączonego serwera w SQL Server. W tym przypadku używam Transact-SQL (w przeciwieństwie do korzystania z GUI, takiego jak SSMS).
Aby utworzyć login dla połączonego serwera, użyj sp_addlinkedsrvlogin
systemowa procedura składowana.
Składnia
Składnia wygląda tak:
sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname' [ , [ @useself = ] { 'TRUE' | 'FALSE' | NULL } ] [ , [ @locallogin = ] 'locallogin' ] [ , [ @rmtuser = ] 'rmtuser' ] [ , [ @rmtpassword = ] 'rmtpassword' ]
Poniższy przykład pokazuje, jak to działa. Bardziej szczegółowe wyjaśnienie każdego argumentu można znaleźć w oficjalnej dokumentacji firmy Microsoft.
Przykład 1 – Dodaj login do połączonego serwera
Oto przykład dodawania loginu SQL Server o nazwie Maggie dla połączonego serwera o nazwie Homer:
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';
Uruchom to na serwerze lokalnym po utworzeniu połączonego serwera. Będziesz potrzebować odpowiedniego loginu z tymi samymi danymi uwierzytelniającymi na rzeczywistym serwerze zdalnym.
Przykład 2 – Uwzględnij serwer połączony
W trosce o kompletność, oto znowu, ale tym razem najpierw tworzę połączony serwer:
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=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';
Dopóki rzeczywisty (zdalny) serwer połączony ma login z tymi samymi danymi uwierzytelniającymi, serwer lokalny będzie mógł zalogować się do serwera połączonego.
Przykład 3 – Dodaj login/użytkownika na zdalnym serwerze
Jak wspomniano, musisz upewnić się, że na zdalnym serwerze istnieje odpowiedni login. Musisz również upewnić się, że ten login jest mapowany na użytkownika bazy danych z odpowiednimi uprawnieniami.
Więc w tym przypadku możemy utworzyć login na zdalnym serwerze, przeskakując na zdalny serwer i uruchamiając to:
CREATE LOGIN Maggie WITH PASSWORD = 'BigStrong#Passw0rd'; USE Music; CREATE USER Maggie FOR LOGIN Maggie; GRANT SELECT ON DATABASE::Music TO Maggie;
Tworzy to login o nazwie Maggie i odpowiadający mu użytkownik bazy danych o nazwie Maggie. Przyznaje również SELECT
uprawnienia Maggie do bazy danych muzyki.
Teraz, kiedy to zrobiłem, wszelkie zapytania rozproszone używające tego loginu będą ograniczone do bazy danych muzyki.
Alternatywa dla użycia GRANT SELECT ON DATABASE
, jest dodanie użytkownika do db_datareader stała rola bazy danych, a może rola niestandardowa.
Jeśli serwer połączony został utworzony przed utworzeniem loginów i użytkowników bazy danych na serwerze zdalnym, może być konieczne usunięcie serwera połączonego i utworzenie go ponownie. Jeśli tak, możesz go upuścić w ten sposób:
EXEC sp_dropserver 'Homer', 'droplogins';
Po upuszczeniu możesz ponownie utworzyć połączony serwer i powiązany z nim login.
Czy naprawdę potrzebuję logowania do serwera połączonego?
Możliwe, że nie musisz nawet dodawać loginu, jak w powyższym przykładzie.
Kiedy po raz pierwszy tworzysz połączony serwer w SQL Server, automatycznie tworzone jest domyślne mapowanie między wszystkimi logowaniami na serwerze lokalnym a zdalnymi logowaniami na serwerze połączonym. SQL Server używa poświadczeń logowania lokalnego podczas łączenia się z serwerem połączonym w imieniu logowania.
Więc jeśli twój lokalny login ma odpowiedni login na połączonym serwerze, z tymi samymi poświadczeniami i ma odpowiednie uprawnienia, możesz iść. Nie ma potrzeby dodawania loginu do połączonego serwera.
Powiedziawszy to, możesz mieć inne powody, aby dodać oddzielny login, na przykład dodanie go dla innych użytkowników.
Możesz także utworzyć mapowanie logowania dla pojedynczego użytkownika lokalnego, w takim przypadku możesz użyć @locallogin
argument, aby określić lokalny login do zmapowania.
Zobacz Jak działają logowanie na połączonych serwerach, aby zapoznać się z przykładami różnych lokalnych loginów próbujących uzyskać dostęp do połączonego serwera w różnych scenariuszach.