Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5821 / 381 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00
Лекция 18:

Создание и использование представлений

Расширение возможностей представлений в SQL Server 2000

В SQL Server 2000 включены два расширения по представлениям: секционированные представления теперь можно модифицировать и распределять по серверам, и представления можно теперь индексировать подобно таблицам. Рассмотрим эти расширения чуть подробнее.

Модифицируемые распределяемые секционированные представления

В Microsoft SQL Server версии 7 и более ранних версий данные представлений были статическими и отражали реальное состояние базовой таблицы или таблиц. В SQL Server 2000 модифицирование, примененное к секционированному представлению, изменяет как представление, так и базовую таблицу или таблицы. Кроме того, секционированные представления могут охватывать несколько систем SQL Server 2000. Секционированные представления можно использовать для реализации объединения серверов баз данных. Объединение (federation) – это группа серверов, каждый из которых администрируется независимо от других серверов, но который используется для равномерного распределения нагрузки всей системы. Создавая объединение серверов, вы распределяете данные между серверами, что позволяет вам осуществлять масштабирование системы. Объединение серверов базы данных может расти, поддерживая самые крупные Web-сайты электронной коммерции или системы баз данных предприятий. На рис. 18.21 показан пример конфигурации для объединения серверов баз данных.

 Объединение систем SQL Server

Рис. 18.21. Объединение систем SQL Server

Прежде чем реализовать секционированное представление, вы должны секционировать вашу таблицу по горизонтали. Вы заменяете исходную таблицу несколькими меньшими таблицами-участницами. Вы задаете для этих таблиц то же количество колонок, что и для исходной таблицы, и присваиваете каждой колонке те же атрибуты (такие как тип данных, размер и сравнение), что и соответствующей колонке в исходной таблице. Вы делаете секционированное представление распределенным, помещая каждую таблицу на отдельном сервере-участнике. Для поддержки более высокого уровня прозрачности операций вы должны присвоить каждой таблице участвующих баз данных одно и то же имя на каждом сервере-участнике. Это не является обязательным требованием, но упрощает управление системой в целом.

При формировании таблиц-участниц вы секционируете их по горизонтали. Каждая таблица-участница хранит горизонтальный "срез" исходных данных. Это секционирование обычно происходит по диапазонам значений ключей. Этот диапазон основывается на реальных значениях данных в секционируемой колонке. Необходимый диапазон значений для каждой таблицы-участницы обеспечивается ограничением CHECK секционируемой колонки. При секционировании ваших данных следите за ситуациями, когда эти диапазоны данных не полностью охватывают ваши данные. Рассмотрим пример горизонтального секционирования. В этом примере мы будем секционировать таблицу сustomer на четыре таблицы-участницы и поместим каждую таблицу на отдельный сервер. Каждый сервер будет содержать 3000 записей таблицы сustomer. Эти ограничения показаны в следующих операторах CREATE TABLE:

Server 1:
CREATE TABLE Customer_Table_1 
   	(CustomerID       		INTEGER PRIMARY KEY 
                     					CHECK (CustomerID BETWEEN 1 АND 3000), 
   	. 
   	.     	(Дополнительные определения колонки)
   	.
Server 2:
CREATE TABLE Customer_Table_2 
   	(CustomerID       		INTEGER PRIMARY KEY 
                     					CHECK (CustomerID BETWEEN 3001 АND 6000), 
   	. 
   	.     	(Дополнительные определения колонки)
   	.
Server 3:
CREATE TABLE Customer_Table_3 
   	(CustomerID       		INTEGER PRIMARY KEY 
                     					CHECK (CustomerID BETWEEN 6001 АND 9000), 

   	. 
  	.     	(Дополнительные определения колонки)
   	.
Server 4:
CREATE TABLE Customer_Table_4 
   	(CustomerID       		INTEGER PRIMARY KEY 
                     					CHECK (CustomerID BETWEEN 9001 АND 12000), 
   	. 
   	.     	(Дополнительные определения колонки)
   	.

После создания таблиц-участниц вы можете определить распределенное секционированное представление на каждом сервере-участнике. Все представления должны иметь одинаковое имя для поддержки прозрачности приложения. Распределенное секционированное представление позволяет выполнять любой запрос на любом сервере-участнике, как будто это запрос для локальных данных. Иными словами, если вы запускаете какой-либо запрос на сервере-участнике, который ссылается на данные любого другого сервера-участника, то эти данные прозрачным образом возвращаются данному запросу.

Для поддержки прозрачности данных вам потребуется создать определения присоединенного сервера на каждом сервере-участнике. Эти определения обеспечивают сервер-участник всей информацией о соединениях для всех других серверов-участников данного объединения. Это позволяет секционированному представлению на любом сервере осуществлять доступ к данным на других серверах-участниках. Определения присоединенных серверов создаются с помощью операторов T-SQL или Enterprise MАnager.

Присоединение серверов с помощью T-SQL

Оператор T-SQL, используемый для определения присоединенного сервера, имеет следующий вид:

sp_addlinkedserver [ @server = ] 'сервер'
            	    [ , [ @srvproduct = ] 'имя_продукта' ]
                    [ , [ @provider = ] 'имя_провайдера' ]
                    [ , [ @datasrc = ] 'источник_данных' ]
                    [ , [ @location = ] 'местоположение' ]
                    [ , [ @provstr = ] 'строка_провайдера' ]
                    [ , [ @catalog = ] 'каталог' ]

Хранимая процедура sp_addlinkedserver имеет следующие параметры:

  • @server.Системное имя присоединенного сервера. Если на данном сервере несколько экземпляров SQL Server, вы должны задать имя в форме имя_сервера\имя_экземпляра.
  • @srvproduct. Имя продукта провайдера OLE DB. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @srvproduct.
  • @provider. Уникальный программный идентификатор провайдера OLE DB, указанного выше параметром @srvproduct. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @provider.
  • @datasrc. Имя источника данных в форме, интерпретируемой данным провайдером OLE DB. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @datasrc, если только вы не подсоединяетесь к определенному экземпляру присоединенного сервера. В этом случае вы должны задать для источника данных имя_сервера\имя_экземпляра.
  • @location. Местоположение базы данных в форме, интерпретируемой данным провайдером OLE DB. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @location.
  • @provstr. Определенная строка для провайдера OLE DB, которая идентифицирует уникальный источник данных. Если вы присоединяете систему SQL Server 2000 к другой системе SQL Server 2000, то вам не нужно указывать @provstr.
  • @catalog. Каталог, используемый при создании соединения с провайдером OLE DB.

Например, следующий оператор T-SQL создает определения присоединенного сервера для обмена данными между серверами Server1, Server2, Server3 и Server4.

Server 1:
sp_addlinkedserver 'Server2' 
sp_setnetname 'Server2', 'sql-server-02' 
sp_addlinkedserverlogin Server2, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server3' 
sp_setnetname 'Server3', 'sql-server-03' 
sp_addlinkedserverlogin Server3, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4' 
sp_setnetname 'Server4', 'sql-server-04' 
sp_addlinkedserverlogin Server4, 'false', 'sa', 'sa'

Server 2:
sp_addlinkedserver 'Server1' 
sp_setnetname 'Server1', 'sql-server-01' 
sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server3' 
sp_setnetname 'Server3', 'sql-server-03' 
sp_addlinkedserverlogin Server3, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4' 
sp_setnetname 'Server4', 'sql-server-04' 
sp_addlinkedserverlogin Server4, 'false', 'sa', 'sa'

Server 3:
sp_addlinkedserver 'Server1' 
sp_setnetname 'Server1', 'sql-server-01' 
sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server2' 
sp_setnetname 'Server2', 'sql-server-02' 
sp_addlinkedsrvlogin Server2, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server4' 
sp_setnetname 'Server4', 'sql-server-04' 
sp_addlinkedsrvlogin Server4, 'false', 'sa', 'sa'

Server 4:
sp_addlinkedserver 'Server1' 
sp_setnetname 'Server1', 'sql-server-01' 
sp_addlinkedsrvlogin Server1, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server2' 
sp_setnetname 'Server2', 'sql-server-02' 
sp_addlinkedsrvlogin Server2, 'false', 'sa', 'sa'
sp_addlinkedserver 'Server3' 
sp_setnetname 'Server3', 'sql-server-03' 
sp_addlinkedsrvlogin Server3, 'false', 'sa', 'sa'

В дополнение к оператору T-SQL sp_addlinkedserver были использованы два оператора. Эти операторы требуются для улучшения обработки распределенного секционированного представления. Обращение к sp_setnetname связывает имя присоединенного сервера в SQL Server с сетевым именем сервера, на котором находится база данных. В этом примере имя присоединенного сервера Server2 находится на сервере с сетевым именем sql-server-02. Мы также задали "верительные данные" для входа на присоединенный сервер. Обращение к sp_addlinkedsrvlogin указывает системе SQL Server, что для доступа к присоединенному серверу нужно использовать заданный идентификатор пользователя (user ID) и пароль.