Thursday, June 5, 2008

Использование распределенных запросов в MS SQL

Для того, чтобы сделать выборку из таблицы, расположенной на другом сервере или получить результат выполнения расположенной там функции или хранимой процедуры, в Microsoft SQL Server предусмотрен механизм распределенных запросов.

Для использования этого механизма целевые сервера должны быть предварительно связаны.

Связанный сервер - это виртуальный сервер, определенный в SQL Server. В определение связанного сервера входит вся информация, необходимая для доступа к источнику данных OLE DB. Настраивают связанный сервер с помощью Enterprise Manager или системной хранимой процедуры sp_addlinkedserver.

Хотя посредством определений связанных серверов обычно запрашивают данные из таких источников , как базы данных, существуют компоненты доступа OLE DB для широкого спектра файлов в различных форматах, в том числе текстовых файлов, данных электронных таблиц и полнотекстового поиска.

После теоретического вступления немного попрактикуемся. Свяжем один MS SQL сервер (назовем его LinkedSRV) с другим (BasicSRV ). На сервере BasicSRV запустите SQL Server Management Studio, раскройте узел Server Objects. В контекстном меню узла Linked Servers выберите пункт New Linked Server.... На вкладке General нужно ввести имя связываемого сервера и выбрать тип сервера SQL Server. На вкладке Security. Выберите переключатель "Be made using the security context" и введите логин и пароль для доступа к удаленному серверу.

После этого вы сможете выполнять запросы к таблицам удаленного сервера используя четырехкомпонентное имя:

имя_связанного_сервера.каталог.схема.имя_объекта,
где имя_связанного сервера - Связанный сервер, ссылающийся на источник данных OLE DB,
каталог - Каталог источника данных OLE DB, в котором содержится объект (например, имя базы данных)
схема - Схема в каталоге, в котором содержится объект (например, dbo)

Вот пример запроса:

SELECT * FROM LinkedSRV.remote_database.dbo.remote_table

Обращаясь подобных образом к объектам удаленной базы данных можно вызывать хранимые процедуры, например:

EXEC LinkedSRV.remote_database.dbo.remote_stored_procedure @param = 10

Если при исполнении этой инструкции вы получите сообщение об ошибке "Server 'LinkedSRV' is not configured for RPC", вам потребуется настроить сервер для исполнения удаленных процедур. По умолчанию эта возможность отключена. Все настройки вашего сервера вы можете просмотреть, исполнив следующий код T-SQL:

exec sp_helpserver

Если в полученной таблице для связанного сервера нет записи 'rpc,rpc out', значит сервер не настроен для RPC.

Чтобы разрешить использование вызова удаленных процедур выполните следующий код:

exec sp_serveroption @server='LinkedSRV', @optname='rpc', @optvalue='true'
exec sp_serveroption @server='LinkedSRV', @optname='rpc out', @optvalue='true'

Теперь вы сможете вызывать хранимые процедуры с других серверов.

No comments: