W tym artykule przedstawiono przykład tworzenia serwera połączonego w programie SQL Server przy użyciu języka Transact-SQL. Korzystanie z T-SQL umożliwia tworzenie połączonego serwera bez polegania na graficznym interfejsie użytkownika (takim jak SSMS).
Składnia
Aby utworzyć połączony serwer przy użyciu T-SQL, użyj sp_addlinkedserver
systemowa procedura składowana.
Oficjalna składnia wygląda następująco:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] [ , [ @provider= ] 'provider_name' ] [ , [ @datasrc= ] 'data_source' ] [ , [ @location= ] 'location' ] [ , [ @provstr= ] 'provider_string' ] [ , [ @catalog= ] 'catalog' ]
Większość argumentów jest opcjonalna, ale będziesz musiał podać nazwę serwera połączonego.
Prawdopodobnie będziesz także chciał określić źródło danych lub lokalizację połączonego serwera, a być może nazwę dostawcy. catalog
argument pozwala określić domyślną bazę danych, do której mapowany jest serwer linkowany. Sprawdź oficjalną dokumentację firmy Microsoft, aby uzyskać wyjaśnienie każdego z tych argumentów.
Przykład – Utwórz połączony serwer
Aby utworzyć połączony serwer przy użyciu T-SQL, wykonaj sp_addlinkedserver
procedura składowana podczas przekazywania nazwy połączonego serwera oraz jego źródła.
Oto przykład tworzenia połączonego serwera:
EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2,1433', @catalog='Music';
W tym przypadku nazwa serwera połączonego to „Homer” i określam adres IP serwera, a następnie port TCP (w moim przypadku jest to w rzeczywistości kontener Dockera na tej samej maszynie). Zmień nazwę serwera i adres IP/port zgodnie z wymaganiami. Określam również domyślną bazę danych o nazwie „Muzyka”.
W tym przykładzie użyto MSOLEDBSQL
jako nazwę dostawcy, ale możesz użyć dowolnej nazwy dostawcy, która ma zastosowanie w Twojej sytuacji. W moim przypadku łączę się z inną instancją SQL Server.
Zauważ, że MSOLEDBSQL
jest zalecanym dostawcą programu SQL Server. Jeśli wcześniej używałeś SQLOLEDB
lub SQLNCLI
, oba są teraz przestarzałe. Microsoft zdecydował się wycofać OLE DB i wydać go w 2018 roku.
Jeśli miałbyś połączyć się z Oracle, możesz użyć OraOLEDB.Oracle
, dla MS Access możesz użyć Microsoft.Jet.OLEDB.4.0
(dla formatów Access 2002-2003) lub Microsoft.ACE.OLEDB.12.0
(dla formatu 2007). Oficjalna dokumentacja zawiera tabelę parametrów do wykorzystania w różnych scenariuszach.
Przetestuj połączony serwer
Po dodaniu połączonego serwera możesz użyć sp_testlinkedserver
aby to przetestować:
EXEC sp_testlinkedserver Homer;
Wynik (jeśli się powiedzie):
Commands completed successfully.
Jeśli pojawi się błąd „Logowanie nie powiodło się”, prawdopodobnie nie masz odpowiedniego loginu na zdalnym serwerze. Musisz mieć odpowiedni login z tymi samymi danymi uwierzytelniającymi, co na serwerze lokalnym.
Działa to tak, że kiedy po raz pierwszy dodajesz serwer linked, automatycznie tworzone jest domyślne mapowanie między wszystkimi loginami na serwerze lokalnym a loginami zdalnymi na serwerze linked. SQL Server używa poświadczeń logowania lokalnego podczas łączenia się z serwerem połączonym w imieniu logowania. Jeśli lokalny login nie ma odpowiedniego loginu na zdalnym serwerze, pojawi się błąd „Logowanie nie powiodło się”.
Dodaj login do połączonego serwera
Jeśli nie chcesz, aby serwer linkowany używał twojego własnego loginu, możesz określić inny login, aby go używać. Tak długo, jak zdalny serwer ma odpowiedni login z tymi samymi danymi uwierzytelniającymi, będziesz gotowy. Oczywiście musisz upewnić się, że konto zdalne ma odpowiednie uprawnienia, aby robić to, czego potrzebujesz.
Oto przykład dodawania loginu SQL Server dla połączonego serwera.
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Marge', @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 (zdalnym) serwerze połączonym.
To dodaje login o nazwie „Marge” dla połączonego serwera o nazwie „Homer”. Dopóki zdalny serwer ma login z tymi samymi poświadczeniami, lokalny serwer będzie mógł zalogować się do połączonego serwera.
Zobacz Dodawanie logowania do serwera połączonego w programie SQL Server, aby zapoznać się z przykładem dodawania odpowiedniego loginu na serwerze zdalnym.
Upuść połączony serwer
Oto przykład usunięcia połączonego serwera o nazwie „Homer” i wszystkich powiązanych loginów.
EXEC sp_dropserver 'Homer', 'droplogins';
droplogins
argument jest opcjonalny, ale jeśli nie określisz tego podczas upuszczania serwera połączonego, który ma skojarzone wpisy logowania serwera zdalnego i serwera połączonego lub jest skonfigurowany jako wydawca replikacji, zostanie zwrócony komunikat o błędzie.
Zobacz Usuwanie połączonego serwera przy użyciu T-SQL, aby uzyskać więcej przykładów porzucania połączonego serwera.
Uruchom zapytanie rozproszone na serwerze połączonym
Teraz, gdy stworzyliśmy połączony serwer, oto przykład uruchomienia w stosunku do niego rozproszonego zapytania:
SELECT * FROM Homer.Music.dbo.Artists;
Jedyną różnicą między tym zapytaniem a lokalnym jest to, że musisz dodać nazwę serwera połączonego do FROM
klauzula.
Tak:
LinkedServer.Database.Schema.Table
Alternatywnie możesz użyć OPENQUERY()
aby uruchomić zapytanie przekazujące:
SELECT * FROM OPENQUERY( Homer, 'SELECT * FROM Music.dbo.Artists;' );