Тази статия предоставя пример за създаване на свързан сървър в SQL Server с помощта на Transact-SQL. Използването на T-SQL ви позволява да създадете свързания сървър, без да разчитате на графичен потребителски интерфейс (като SSMS).
Синтаксис
За да създадете свързан сървър с помощта на T-SQL, използвайте sp_addlinkedserver
системна съхранена процедура.
Официалният синтаксис е така:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] [ , [ @provider= ] 'provider_name' ] [ , [ @datasrc= ] 'data_source' ] [ , [ @location= ] 'location' ] [ , [ @provstr= ] 'provider_string' ] [ , [ @catalog= ] 'catalog' ]
Повечето от аргументите са незадължителни, но ще трябва да предоставите името на свързания сървър.
Вероятно ще искате да посочите източника на данни или местоположението на свързания сървър и може би име на доставчик. catalog
аргумент ви позволява да посочите база данни по подразбиране, към която е съпоставен свързаният сървър. Вижте официалната документация на Microsoft за обяснение на всеки от тези аргументи.
Пример – Създайте свързания сървър
За да създадете свързан сървър с помощта на T-SQL, изпълнете sp_addlinkedserver
съхранена процедура, докато предава името на свързания сървър, както и неговия източник.
Ето пример за създаване на свързан сървър:
EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2,1433', @catalog='Music';
В този случай името на свързания сървър е „Homer“ и аз посочвам IP адреса на сървъра, последван от TCP порта (в моя случай това всъщност е Docker контейнер на същата машина). Променете името на сървъра и IP адреса/порта според нуждите. Посочвам също база данни по подразбиране, наречена „Музика“.
Този пример използва MSOLEDBSQL
като име на доставчик, но можете да използвате името на доставчика, което е приложимо във вашата ситуация. В моя случай се свързвам с друг екземпляр на SQL Server.
Имайте предвид, че MSOLEDBSQL
е препоръчителният доставчик за SQL Server. Ако преди сте използвали SQLOLEDB
или SQLNCLI
, и двете вече са остарели. Microsoft реши да отмени OLE DB и да го пусне през 2018 г.
Ако трябва да се свържете с Oracle, може да използвате OraOLEDB.Oracle
, за MS Access можете да използвате Microsoft.Jet.OLEDB.4.0
(за достъп до форматите 2002-2003) или Microsoft.ACE.OLEDB.12.0
(за формат 2007 г.). Официалната документация има таблица с параметри, които да се използват за различни сценарии.
Тествайте свързания сървър
След като добавите свързания сървър, можете да използвате sp_testlinkedserver
за да го тествате:
EXEC sp_testlinkedserver Homer;
Резултат (ако е успешен):
Commands completed successfully.
Ако получите грешка „Неуспешно влизане“, има вероятност да нямате съответното влизане на отдалечения сървър. Ще трябва да имате съответно вход със същите идентификационни данни като този на локалния сървър.
Начинът, по който работи, е, че когато за първи път добавите свързания сървър, автоматично се създава съпоставяне по подразбиране между всички влизания на локалния сървър и отдалечени влизания на свързания сървър. SQL Server използва идентификационните данни на локалния вход, когато се свързва към свързания сървър от името на входа. Ако вашето локално влизане няма съответни данни за вход на отдалечения сървър, тогава ще получите грешка „Неуспешно влизане“.
Добавяне на вход за свързания сървър
Ако не искате свързаният сървър да използва вашето собствено потребителско име, можете да посочите друго потребителско име, което да използва. Докато отдалеченият сървър има съответни данни за вход със същите идентификационни данни, ще бъдете готови. Очевидно ще трябва да се уверите, че отдалеченият акаунт има подходящите разрешения, за да прави това, от което се нуждаете.
Ето пример за добавяне на данни за вход в SQL Server за свързания сървър.
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Marge', @rmtpassword=N'BigStrong#Passw0rd';
Изпълнете това на локалния сървър, след като създадете свързания сървър. Ще ви трябва съответни данни за вход със същите идентификационни данни на действителния (отдалечен) свързан сървър.
Това добавя вход, наречен „Marge“ за свързания сървър, наречен „Homer“. Докато отдалеченият сървър има вход със същите идентификационни данни, локалният сървър ще може да влезе в свързания сървър.
Вижте Добавяне на вход на свързан сървър в SQL Server за пример за добавяне на съответни данни за вход на отдалечения сървър.
Изхвърлете свързан сървър
Ето пример за премахване на свързания сървър, наречен „Homer“, и всички свързани данни за влизане.
EXEC sp_dropserver 'Homer', 'droplogins';
droplogins
аргументът не е задължителен, но ако не посочите това, когато махнете свързан сървър, който има свързани записи за влизане в отдалечен и свързан сървър или е конфигуриран като издател на репликация, се връща съобщение за грешка.
Вижте Премахване на свързан сървър с T-SQL за повече примери за премахване на свързан сървър.
Изпълнете разпределена заявка срещу свързания сървър
След като създадохме свързания сървър, ето пример за изпълнение на разпределена заявка към него:
SELECT * FROM Homer.Music.dbo.Artists;
Единствената разлика между това и локалната заявка е, че трябва да добавите името на свързан сървър към FROM
клауза.
Като това:
LinkedServer.Database.Schema.Table
Като алтернатива можете да използвате OPENQUERY()
за изпълнение на преходна заявка:
SELECT * FROM OPENQUERY( Homer, 'SELECT * FROM Music.dbo.Artists;' );