Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 27

Следующий пример использует OLE DB для доступа к MS Access:

SELECT a.*

FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'c:\Northwind.mdb';

'newcustomer'; 'mypass', Orders) AS a

12.2 Установка окружения связанных серверов

Для выполнения операторов Transact-SQL на удалённом SQL сервере или источнике данных OLE DB, вы должны обеспечить соединение к серверу или источнику данных. Вы можете обеспечить соединение с удалённым SQL сервером с помощью SQL Server Enterprise Manager или встроенной процедуры sp_addlinkedserver. Эта процедура определяет удалённый источник на локальном компьютере и указывает OLE DB Provider.

sp_addlinkedserver [ @server = ] 'server'

[ , [ @srvproduct = ] 'product_name' ]

[ , [ @provider = ] 'provider_name' ]

[ , [ @datasrc = ] 'data_source' ]

[ , [ @location = ] 'location' ]

[ , [ @provstr = ] 'provider_string' ]

[ , [ @catalog = ] 'catalog' ]

Если вы хотите подключить сервер, который запущен под SQL Server, вы должны указать только параметры @srvproduct и @server.

Следующий пример подключает SQL Server с именем AccountingServer:

EXEC sp_addlinkedserver ‘AccountingServer’, ‘SQL Server’

Следующий пример подключает Oracle сервер:

EXEC sp_addlinkedserver ‘OracleFinance’, ‘Oracle’, ‘MSDAORA’, ‘OracleDB’

Обеспечение безопасности связанных серверов

Вам может понадобиться обеспечить безопасность между локальным и удалённым сервером. Когда вы обеспечиваете безопасность, примите к сведению следующие факты:

*  Когда пользователи входят в локальный SQL Server и выполняете распределённый запрос, локальный сервер входит в удалённый от вашего имени.

*  Если имя пользователя и пароль существуют на обоих серверах, локальный сервер может использовать свои данные для входа на удалённый сервер.

*  Вы можете отображать пользователя и пароль между локальным и удалённым сервером, используя процедуру sp_addlinkedsrvlogin. Когда вы отображаете локальную учётную запись, у вас не будет необходимости создавать пользовательскую учётную запись для каждого пользователя на удалённом сервере.

*  Вы можете использовать делегирование для упрощения авторизации.

*  Связанные сервера не поддерживают делегирования.

12.3 Выполнение запросов на связанном сервере

Сервер SQL может обрабатывать распределённые запросы локально на локальном сервере или удалённо на связанном сервере.

Работа со связанным сервером

Распределённые запросы получают доступ к данным из многих источников данных, таких как OLE DB и другие серверы SQL.

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

Когда вы выполняете распределённый запрос, вы должны ссылаться на связанные объекты используя именование из 4-х частей в следующем формате имя-связанного-сервера.каталог.владелец.таблица.

Когда вы используете связанные сервера, вы можете выполнять следующие операторы Transact-SQL к связанным данным:

*  SELECT с использованием WHERE или JOIN.

*  INSERT, UPDATE или DELETE.

Когда вы используете связанные сервера, вы не можете:

*  Использовать операторы CREATE, ALTER или DROP на связанном сервере. Вы не можете создавать, изменять или удалять объекты на удалённом сервере, но вы можете создать таблицу на локальном сервере с помощью SELECT INTO.

*  Использовать сортировку ORDER BY.

*  Использовать READTEXT, WRITETEXT и UPDATETEXT.

Выполнение запросов к связанному серверу

Пример 1

SELECT CompanyName

FROM AccountingServer.NorthwindRemote.dbo.Supplies

Пример 2

В следующем примере происходит объединение локальной таблицы с удалённой:

SELECT ProductName, CompanyName

FROM Product p JOIN

AccountingServer.NorthwindRemote.dbo.Supplies S

ON p.SupplierID = s.SupplierID