Удаленный доступ к данным

 

Существует два способа обращения к данным, находящимся на разных серверах: удаленный вызов процедур(RPC) и распределенные запросы. Удаленный вызов процедур (RCP, remote procedure call) используется для доступа к данным, которые находятся на другом SQL Server. Для того чтобы стал возможным RCP оба сервера необходимо настроить на взаимодействие друг с другом. Для этого имена локального и удаленного сервера должны быть зарегистрированы с помощью хранимой процедуры:

Sp_addserver @server = ‘сервер’

[, @local=’локальный’|NULL]

@server - имя сервера,

@local – определяет, является ли сервер локальным. Если установлено значение ’локальный’, то сервер считается локальным, если NULL, то удаленным.

Затем выполняется настройка только системным администратором RCP. По умолчанию настройка SQL Server позволяет ему как принимать, так и производить вызовы RCP. Для изменения этих настроек можно воспользоваться процедурой:

Sp_configure ‘remote access’,[1|0]

Reconfigure

При параметре 1 разрешен доступ к данному серверу, при 0, другие серверы не могут обращаться к этому серверу. Характер взаимодействия можно определить с помощью процедуры:

Sp_serveroption @server = ‘сервер’

[,@optname = ‘наименование параметра’]

[,@optvalue = ‘значение параметра’], где

наименование параметра, значение параметра

‘rcp’, ‘rcp out’ ‘true’, ‘false’

Если вы устанавливаете для ‘rcp’ значение ‘true’, то локальный сервер сможет принимать вызовы RCP от серверов, определенных в параметре @server. Если тоже значение будет установлено для ‘rcp out’, то локальный сервер сможет посылать вызовы RCP на серверы, определенные в аргументе @server. После того как серверы настроены, можно осуществлять удаленное выполнение хранимых процедур, используя их полные имена:

Exec[ute] имя сервера.[база данных].[владелец].имя хранимой процедуры [параметр [,параметр…]].

Удаленная хранимая процедура выполняет любые действия, выполняемые локальными процедурами: возвращать одно число, или набор значений, передавать записи и отдельные значения.

Распределенные запросы позволяют обратиться к данным из нескольких источников в одном запросе. Распределенный запрос выполняет на локальном сервере команду SQL, которая влияет на данные удаленного сервера. Перед использованием распределенных запросов подключение должно установить флаги ANSI_NULLS ANSI_WARNINGS: SET ANSI_NULLS ON, SET ANSI_WARNINGS ON

Связанный сервер представляет собой заранее сконфигурированный источник данных OLE DB. Команды SQL ссылаются на связанный сервер по полному имени объекта. Перед использованием связанного сервера необходимо предварительно настроить локальный сервер на работу с удаленным источником. Полное имя объекта выглядит следующим образом: Имя сервера.имя базы.имя владельца объекта.имя объекта

Помимо уточнения имени удаленного сервера необходимо указать имя связанного сервера при вызове функции OPENQUERY. Эта функция возвращает набор записей, который может использоваться в командах SQL вместо таблицы или представления. Функция OPENQUERY предназначена для выполнения сквозных запросов в источниках данных OLE DB: Openquery(связанный сервер,’запрос’)

Локальный сервер предварительно должен быть настроен на работу со связанным сервером:

1) сначала связанный сервер надо добавить с помощью процедуры

sp_addlinkedserver @server=’сервер’

[,@srvproduct = ‘наименование программного продукта’]

[,@provider = ‘драйвер соединения’]

[@datasrc = ‘источник данных’]

[@location =’местонахождение’]

[,@provstr = ‘строка драйвера’]

[@catalog = ‘каталог’]

Здесь:

@server – имя связанного сервера,

@srvproduct – наименование программного продукта, если он указан, то остальные параметры указывать не обязательно,

@provider – уникальный программный идентификатор обработчика OLE DB для источника данных, который должен быть зарегистрирован в реестре,

@datasrc – имя источника данных, известное обработчику OLE DB,

@location – местонахождение базы данных, известное обработчику OLE DB

@provstr – специфическая для провайдера OLE DB строка, которая идентифицирует уникальный источник данных,

@catalog – каталог, используемый при установлении соединения с провайдером OLE DB.

Имеется ещё одна функция, которую можно использовать, если заранее источник не создан:

OPENROWSET(‘имя провайдера’

{‘ источник данных’ ; ‘ идентификатор пользователя’ ; ‘пароль’| ‘строка драйвера’}

{[Каталог.] [структура.] объект| ‘запрос’})

При работе с удаленными данными происходят преобразования типа данных и кодировки, используемых на локальном сервере. При выборке данных командами SELECT, UPDATE, INSERT, DELETE удаленные данные преобразуются в тип данных и кодировку локального сервера. При модификации данных данные локального сервера преобразуются к типу данных и кодировке удаленного сервера. Если кодировка удаленных данных отличатся от кодировки локального сервера, результаты запроса могут оказаться бессмысленными. В распределенных запросах разрешаются команды SELECT, состоящие только из секций SELECT, FROM, WHERE.Секция INTO разрешается при условии, что создаваемая таблица находится на локальном сервере. Команды UPDATE, INSERT, DELETE должны соответствовать требованиям OLE DB на удаленном сервере. При работе с удаленной таблицей с помощью курсора секция обновления и удаления WHERE CURRENT OF может выполняться лишь в том случае, если провайдер OLE DB поддерживает данную возможность. Команды полнотекстовой обработки не функционируют в распределенных запросах. Команды CREATE, DROP, ALTER не могут использоваться для удаленных серверов. Курсоры типа STATIC, INSENSITIVE могут ссылаться на удаленные таблицы. Курсоры типа KEYSET могут ссылаться на удаленные таблицы лишь в том случае, если провайдер OLE DB соответствует требованиям, документированным в описании функциональных возможностей курсоров KEYSET. Курсоры FORWARD_ONLY не работают с удаленными таблицами.

Распределенные транзакции работают с данными, находящимися на двух и более серверах. Для явного указания распределенной транзакции используется команда:

Begin distributed transaction [<имя транзакции>]

 

Глава 8. Администрирование баз данных на примере SQL Server