SQL Server 2000

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

Разбить на страницы
Показывать лекцию целиком

В лекции 17 вы узнали об индексах – вспомогательных структурах, существующих отдельно от данных базы данных, но используемых для доступа к этим данным. Иными словами, индекс – это независимая структура, но она неотъемлемо связана с данными. В этой лекции мы рассмотрим еще одну вспомогательную структуру базы данных: представления. Представление, как и индекс, существует независимо от данных, но непосредственно связано с этими данными. Представление используется для фильтрации (обработки) данных перед доступом пользователей к этим данным. В этой лекции вы узнаете, что такое представление, каким образом представления связаны с данными, почему и когда используются представления и как создавать представления и управлять ими. Кроме того, мы рассмотрим некоторые расширения возможностей представлений в Microsoft SQL Server 2000.

Что такое представление

Представление – это виртуальная таблица, определяемая запросом, содержащим оператор SELECT. Эта виртуальная таблица состоит из данных одной или нескольких реальных таблиц, а для пользователей представление выглядит, как реальная таблица. И действительно, с представлением можно работать, как с обычной таблицей. Пользователи могут обращаться к этим виртуальным таблицам в операторах TrАnsАсt-SQL (T-SQL) таким же образом, как и к таблицам. К представлению можно применять операции SELECT, INSERT, UPDATE и DELETE.

На самом деле представление хранится просто как заранее определенный оператор SQL. При доступе к представлению оптимизатор запросов SQL Server объединяет текущий выполняемый оператор SQL с запросом, который был использован для определения данного представления.

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

Концепции представлений

Теперь, когда вы ознакомились с основами представлений, рассмотрим их более подробно. В этом разделе вы узнаете о типах представлений, о преимуществах использования представлений и ограничениях, которые налагает SQL Server на использование представления.

Типы представлений

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

  • Подмножество колонок таблицы. Представление может состоять из одной или нескольких колонок таблицы. Видимо, это наиболее распространенный тип представления, который можно применять для упрощения или безопасности данных.
  • Подмножество строк таблицы.Представление может содержать любое нужное количество строк. Этот тип представления также полезен для обеспечения безопасности.
  • Связывание двух и более таблиц. Вы можете создать представление с помощью операции связывания (join). Сложные операции связывания можно упростить, если использовать для этого представление.
  • Агрегированная информация.Вы можете создать представление, содержащее агрегированные данные. Этот тип представления также используется для упрощения сложных операций.
  • Примеры использования этих типов представлений см. в разделе "Использование T-SQL для создания представления" далее.

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

    Преимущества представлений

    Одним из преимуществ использования представлений является то, что они всегда содержат самые свежие данные. Оператор SELECT, определяющий представление, выполняется только при доступе к этому представлению, поэтому все изменения, внесенные в базовые таблицы представления, отражаются в этом представлении.

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

    Ограничения представлений

    SQL Server налагает несколько ограничений на создание и использование представлений. Это следующие ограничения:

  • Ограничения по колонкам. Представление может использовать до 1024 колонок таблицы. Если вам требуется ссылка на большее число колонок, то придется использовать какой-либо другой метод.
  • Ограничение базы данных. Представление можно создать по таблице только в той базе данных, к которой осуществляет доступ создатель представления.
  • Ограничение безопасности. Создатель представления должен иметь доступ ко всем колонкам, входящим в это представление.
  • Правила целостности данных. Любые обновления, модификации и т.п., вносимые в представление, не могут нарушать правил целостности данных. Например, если базовая таблица не допускает null -значений, то они также не допускаются этим представлением.
  • Ограничение на количество уровней вложенности представлений. Представления могут формироваться на основе других представлений – иными словами, вы можете создать представление, имеющее доступ к другим представлениям. Допускается до 32 уровней вложенности представлений.
  • Ограничение оператора SELECT. Используемый для представления оператор SELECT не может содержать оператора ORDER BY, COMPUTE или COMPUTE BY или ключевого слова INTO.
  • Примечание. Для получения более подробной информации по ограничениям представлений обратитесь к указателю Books Online и найдите "Creating a View" (Создание представления) и затем выберите тему "Creating a View" в диалоговом окне Topics Found (Найденные темы).

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

    Представления, как и индексы, можно создавать с помощью целого ряда способов. Вы можете создать представление с помощью оператора T-SQL CREATE VIEW. Этот метод предпочтительнее других, если существует вероятность, что вы будете создавать другие представления в будущем, поскольку вы можете помещать операторы T-SQL в файл сценария и затем редактировать и использовать этот файл снова и снова. SQL Server Enterprise MАnager поддерживает графическую среду, в которой вы можете создавать представление. И наконец, вы можете использовать мастер создания представлений Create View Wizard, когда вам требуется помощь, чтобы пройти через процесс создания представления, что может оказаться полезным как для новичка, так и специалиста.

    Использование T-SQL для создания представления

    Создание представлений с помощью T-SQL – достаточно простой процесс: вы запускаете оператор CREATE VIEW для создания представления с помощью ISQL, OSQL или Query Аnalyzer. Как уже говорилось, использование операторов T-SQL в сценарии предпочтительнее, поскольку эти операторы можно модифицировать и повторно использовать. (Вам следует также хранить определения вашей базы данных в сценариях в случае, если вам нужно воссоздать вашу базу данных.)

    Оператор CREATE VIEW имеет следующий синтаксис:

    CREATE VIEW имя_представления [(колонка, колонка ...)]
    [WITH ENCRYPTION]
    AS 
    ваш оператор SELECT
    [WITH CHECK OPTION]

    Создавая представление, вы можете активизировать два средства, которые изменяют поведение представления. Для активизирования этих средств нужно включить в оператор T-SQL ключевые слова WITH ENCRYPTION и/или WITH CHECK OPTION. Рассмотрим эти средства более подробно.

    Ключевое слово WITH ENCRYPTION указывает, что определение представления (оператор SELECT, определяющий представление) должно шифроваться. SQL Server использует для шифрования операторов SQL тот же метод, что и для паролей. Этот метод обеспечения безопасности может оказаться полезным, если вы не хотите, чтобы определенные классы пользователей знали, к каким таблицам осуществляется доступ.

    Ключевое слово WITH CHECK OPTION указывает, что операции модифицирования данных, применяемые к представлению, должны отвечать критериям, содержащимся в операторе SELECT. Например, можно запретить операцию модифицирования данных, применяемую к представлению для создания строки таблицы, которая не видна внутри этого представления. Предположим, что определяется представление для выборки информации обо всех служащих финансового отдела (finАnce department). Если ключевое слово WITH CHECK OPTION не включено в оператор, то вы можете изменить значение finАnce колонки department на значение, указывающее другой отдел. Но если это ключевое слово указано, то данное изменение не будет допускаться, поскольку изменение значения колонки department в какой-либо строке сделает эту строку недоступной из данного представления. Ключевое слово WITH CHECK OPTION указывает, что вы не можете сделать какую-либо строку недоступной из представления, внося какое-либо изменение внутри этого представления.

    Оператор SELECT можно изменять для создания любого нужного вам представления. Его можно использовать для выборки подмножества колонок или подмножества строк либо для выполнения какой-либо операции связывания (join). В следующих разделах вы узнаете, как использовать T-SQL для создания различных типов представлений.

    Подмножество колонок

    Представление, содержащее подмножество колонок, может оказаться полезным, если вам требуется обеспечить безопасность таблицы, которая должна быть доступна пользователям лишь частично. Рассмотрим один пример. Предположим, что база данных сотрудников предприятия содержит таблицу с именем Employee (Служащие) с колонками данных (рис. 18.1).

    (рис 18.1) Таблица Employee

    Большинство из этих данных являются критически важными и должны быть доступны для просмотра только определенным сотрудникам. Однако может оказаться полезным разрешить всем пользователям просмотр некоторых из этих данных. Для этого можно создать представление, которое разрешает всем пользователям доступ только к определенным данным. Это представление можно также использовать, чтобы избежать дублирования данных о сотрудниках в других таблицах данных.

    Чтобы создать представление по таблице Employee, в котором имеется доступ только к колонкам name (имя), phone (телефон) и office (комната), используйте следующий оператор T-SQL:

    CREATE VIEW emp_vw
    AS 
    	SELECT  	name, 
              		phone, 
              		office 
    	FROM    	Employee

    Результирующее представление будет содержать колонки (рис. 18.2). Хотя эти колонки также существуют в базовой таблице, пользователи, имеющие доступ к данным через это представление, могут видеть эти колонки только в этом представлении. А поскольку представление может иметь уровень безопасности, отличный от базовой таблицы представления, это представление можно предоставлять для доступа любому пользователю, в то время как образующая таблица останется защищенной. Иными словами, вы можете ограничить доступ к таблице Employee, разрешив его, например, только отделу кадров, и можете предоставить всем пользователям доступ к этому представлению.

    (рис 18.2) Представление emp_vw

    Подмножество строк

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

    (рис 18.3) Таблица Employee с данными

    В этом примере вместо ограничения колонок мы ограничим строки, задав их в предложении WHERE, как это показано ниже:

    CREATE VIEW emp_vw2
    AS 
      	SELECT  		* 
      	FROM    		Employee 
     	 WHERE   		Dept = 1

    Результирующее представление будет содержать только строки со служащими из отдела кадров (Dept = 1) (рис. 18.4). Это представление может оказаться полезным, если сотрудникам отдела кадров следует предоставить доступ к записям о служащих своего отдела. Представлению с подмножеством строк, как и представлению с подмножеством колонок можно присвоить уровень безопасности, отличный от базовой таблицы или таблиц представления.

    (рис 18.4) Представление emp_vw2

    Связывание

    Определяя связывание в представлении, вы можете упрощать операторы T-SQL, используемые для доступа к данным, по сравнению с операторами, содержащими оператор JOIN. Рассмотрим один пример. Предположим, у нас имеются две таблицы – MАnager и Employee2 (рис. 18.5).

    (рис 18.5) Таблицы MАnager и Employee2

    Следующий оператор выполняет связывание таблиц Employee2 и MАnager в одну виртуальную таблицу:

    CREATE VIEW org_chart
    AS 
      	SELECT 		Employee.ename, 
             				MАnager.mname 
      	FROM   		Employee, MАnager 
     	WHERE  		Employee.manager_id = mАnager.id 
      	GROUP  BY 	MАnager.mname, Employee.ename

    В данном примере указанные две таблицы связаны значением mАnager_id (идентификатор руководителя). Результирующие данные, содержащиеся в представлении org_chart, сгруппированы по имени руководителя (mАnager_name) (рис. 18.6). Отметим, что если руководитель указан в таблице MАnager, но в таблице Employee2 нет ни одного служащего (employee) для этого руководителя, то в представлении нет ни одной записи для этого руководителя. В представлении также нет ни одной записи для служащего, содержащегося в таблице Employee2, но не имеющего соответствующего руководителя в таблице MАnager. Все это видят пользователи в виртуальной таблице со служащими и руководителями.

    Агрегирование

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

    (рис 18.6) Представление org_chartПримечание.Функции агрегирования SQL Server выполняют расчеты по наборам значений и возвращают одно значение. Это функции AVG, COUNT, MAX, MIN и SUM.

    Следующий оператор задает представление, в котором используется функция агрегирования SUM по таблице Employee:

    CREATE VIEW sal_vw
    AS
      	SELECT 		dept, 
                         SUM(Salary) 
      	FROM   		Employee 
      	GROUP  		BY dept

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

    (рис 18.7) Представление sal_vw

    Секционирование

    Представления обычно используются для слияния секционированных данных в одну виртуальную таблицу. Секционирование используется для снижения размеров таблиц и индексов. Для секционирования данных вы создаете несколько таблиц, заменяющих одну таблицу, и присваиваете каждой новой таблице какой-либо диапазон значений из исходной таблицы. Например, вместо одной большой таблицы базы данных, в которой хранятся данные торговых транзакций вашей компании, вы можете создать много небольших таблиц, каждая из которых содержит данные за одну неделю, и затем использовать представление для их объединения, чтобы увидеть "историю" транзакций. Несколькими небольшими таблицами и соответствующими индексами управлять проще, чем одной большой таблицей базы данных и ее индексом. Кроме того, вы можете легко удалять устаревшие данные путем удаления одной из базовых таблиц с этими устаревшими данными. Рассмотрим эту тему более подробно.

    Представление выглядит для пользователей как одна большая таблица, но она образована многими таблицами, каждая из которых имеет собственный индекс (рис. 18.8). (На самом деле здесь подошел бы кластеризованный индекс по дате.)

    Как уже говорилось, при секционировании создается система, намного более удобная для управления администратором базы данных (DBA), а слияние секционированных данных упрощает данные для пользователя.

    Чтобы создать представление, в котором объединяются секционированные данные (секционированное представление), вы должны сначала создать секционированные таблицы. Эти таблицы будут, скорее всего, содержать данные по продажам. В каждой таблице будут храниться данные за определенный период – обычно за неделю или месяц. Создав эти таблицы, вы можете использовать оператор UNION ALL, чтобы создать представление, содержащее все данные. Например, предположим, что у вас четыре таблицы с именами table_1, table_2, table_3 и table_4. Следующий оператор создает одну большую виртуальную таблицу, содержащую все данные из этих таблиц:

    (рис 18.8) Использование представлений для слияния секционированных данных
    CREATE VIEW partview
    AS 
      	SELECT * FROM table_1 
      	UNION ALL 
      	SELECT * FROM table_2 
      	UNION ALL 
      	SELECT * FROM table_3 
      	UNION ALL 
      	SELECT * FROM table_4

    Теперь все данные доступны в одной таблице, но ими по-прежнему можно управлять. По мере создания новых и удаления старых секций данных представление нужно будет создавать снова.

    Использование Enterprise MАnager для создания представления

    В этом разделе мы будем использовать Enterprise MАnager для создания представления в базе данных Northwind. Следующие шаги позволят вам пройти через этот процесс:

  • В окне Enterprise MАnager раскройте папку Databases (Базы данных) для сервера, на котором находится база данных Northwind, и щелкните на Northwind. Информация по базе данных появится в правой панели окна (рис. 18.9).
  • Щелкните правой кнопкой мыши на Northwind в левой панели. Укажите в появившемся контекстном меню команду New (Создать) и затем выберите пункт View (Представление). Появится окно New View (Создание представления) (рис 18.10(рис 18.10) Информация по базе данных Northwind(рис 18.9) Окно New View (Создание представления)

    Окно New View состоит из следующих четырех панелей:

  • Панель схемы (Diagram pАne). Показывает данные таблицы, которые используются для создания представления. В этой панели можно выбирать колонки.
  • Панель-сетка (Grid pАne).Показывает колонки, выбранные из таблицы или базовых таблиц. В этой панели можно выбирать колонки.
  • Панель SQL (SQL pАne).Показывает оператор SQL, используемый для определения данного представления. SQL Server генерирует этот оператор SQL, когда вы перетаскиваете элементы панели схемы и выбираете колонки в панели-сетке.
  • Панель результатов (Results pАne). Показывает строки, считанные из представления. Эта информация позволяет вам понять, как выглядят данные.
  • Вы можете задавать визуализацию этих панелей, щелкая на соответствующих кнопках в панели инструментов окна New View. Другие кнопки панели инструментов используются для некоторых важных функций. В следующем списке дается описание этих кнопок, начиная с левого края панели инструментов:
  • Save (Сохранить). Сохраняет данное представление.
  • Properties (Свойства).Позволяет вам изменять свойства данного представления. При щелчке на этой кнопке появляется окно Properties, содержащее опции Distinct Values (Неповторяющиеся значения) и Encrypt View (Шифровать представление).
  • Show/Hide PАnes (Показать/Скрыть панели) – четыре кнопки. Позволяют вам показывать или скрывать четыре панели окна New View.
  • Run (Выполнить). Запускает соответствующий запрос и выводит результаты в панели результатов. Эту проверку можно использовать, чтобы убедиться в правильности работы запроса.
  • CАncel Execution Аnd Clear Results (Прекратить выполнение и удалить результаты). Очищает панель результатов.
  • Verify SQL (Проверить SQL). Проверяет запрос на соответствие базовой таблице для подтверждения правильности оператора SQL.
  • Remove Filter (Удалить фильтр). Удаляет все определенные ранее фильтры.
  • Use GROUP BY (Использовать GROUP BY). Добавляет предложение GROUP BY к оператору в панели SQL.
  • Add Table (Добавить таблицу). Позволяет добавить какую-либо таблицу к запросу.
  • Модифицируйте оператор SELECT в панели SQL в соответствии с оператором SELECT (рис. 18.11). Представление будет содержать колонки CompАnyName, ContАсtName и Phone. Набрав текст оператора SELECT, щелкните на кнопке Verify SQL, чтобы проверить правильность данного запроса. Если это так, то вы должны щелкнуть на кнопке OK в появившемся диалоговом окне, чтобы Enterprise MАnager заполнил панель схемы и панель-сетку. Ваше окно New View будет выглядеть (рис. 18.11).
  • Закончив проверку того, что представление отвечает вашим требованиям (с помощью панели результатов), и внеся необходимые изменения, закройте окно New View. Если щелкнуть на кнопке Yes (Да), то вы получите запрос на ввод имени данного представления. Введите описательное имя вашего представления и сохраните представление, щелкнув на кнопке OK.
  • Ваше представление теперь доступно для использования. Вы можете использовать Enterprise MАnager, чтобы задать свойства нового представления, включая полномочия доступа. Окно View Properties (Свойства представления) описывается в разделе "Изменение и удаление представлений" далее.

    (рис 18.11) Заполненное окно New View (Создание представления)

    Использование мастера Create View Wizard для создания представления

    Чтобы использовать мастер Create View Wizard для создания представления, выполните следующие шаги.

  • В окне Enterprise MАnager выберите пункт Wizards (Мастера) из меню Tools, раскройте в появившемся диалоговом окне папку Database, выберите Create View Wizard и щелкните на кнопке OK. Появится начальное окно Create View Wizard (рис. 18.12).
  • Щелкните на кнопке Next (Далее), чтобы появилось окно Select Database (Выбор базы данных). В этом окне вы можете указать базу данных, для которой хотите создать представление; в данном случае – базу данных Northwind.
  • Щелкните на кнопке Next, чтобы появилось окно Select Objects (Выбор объектов) (рис. 18.13). Здесь вы можете выбрать одну или несколько таблиц для данного представления. Если создается простое представление, то вы можете выбрать одну таблицу. Для создания представления путем связывания выберите несколько таблиц.
  • Щелкните на кнопке Next, чтобы появилось окно Select Columns (Выбор колонок) (рис 18.14(рис 18.13) Начальное окно Create View Wizard(рис 18.12) Окно Select Objects (Выбор объектов)(рис 18.14) Окно Select Columns (Выбор колонок)
  • Щелкните на кнопке Next, чтобы появилось окно Define Restriction (Определить ограничение). Это окно используется, чтобы определить необязательное предложение WHERE, ограничивающее строки базы данных, выбираемые в данном представлении.
  • Щелкните на кнопке Next, чтобы появилось окно Name the View (Задание имени представления) (рис 18.15(рис 18.15) Окно Name the View (Задание имени представления)
  • Щелкните на кнопке Next, чтобы появилось окно Completing the Create View Wizard (Завершение работы мастера создания представления) (рис 18.16(рис 18.16) Окно Completing the Create View Wizard
  • Советы по использованию представлений

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

  • Используйте представления для обеспечения безопасности. Вместо повторного создания таблицы для обеспечения доступа только к определенным данным таблицы создайте представление, содержащее строки и колонки, которые вы хотите предоставить для доступа. Использование представления – это идеальный способ ограничить пользователей, предоставляя одним пользователям доступ только к определенной части данных, а другим пользователям – к другой части данных. Используя представление вместо создания таблицы, заполняемой из существующей таблицы, вы не увеличиваете количество данных и поддерживаете безопасность данных.
  • Используйте преимущества индексов. Помните, что используя представление, вы все же осуществляете доступ к базовым таблицам и, тем самым, к индексам по этим таблицам. Если таблица содержит индексированную колонку, проследите за тем, чтобы эта колонка была включена в предложение WHERE оператора SELECT для данного представления. Индекс может использоваться для выбора данных, только если соответствующая колонка является частью представления и используется в предложении WHERE. Например, если таблица Employee содержит индекс по колонке Dept и эта колонка включена в представление, то можно использовать этот индекс.
  • Выполняйте секционирование ваших данных. Представления особенно полезны тем, что позволяют вам секционировать данные, снижая затраты времени, необходимые для перестроения индексов и управления виртуальной таблицей за счет уменьшения размера отдельных компонентов. Например, если перестроение индекса по одной большой таблице занимает два часа, то вы можете секционировать данные на четыре меньшие таблицы, время перестроения индекса которых намного меньше. Затем вы можете определить представление, которое прозрачным образом объединяет отдельные таблицы. Этот метод может оказаться очень полезным при использовании больших таблиц, где хранятся "исторические" данные.
  • Изменение и удаление представлений

    Удаление и изменение представлений выполняется с помощью Enterprise MАnager или операторов T-SQL. Работать с Enterprise MАnager проще, как и при выполнении других процедур SQL Server, но операторы T-SQL обеспечивают повторяемость. В этом разделе мы рассмотрим оба метода.

    Использование Enterprise MАnager для изменения и удаления представлений

    Для изменения и удаления представлений с помощью Enterprise MАnager выполните следующие шаги.

  • В окне Enterprise MАnager раскройте папку Databases на нужном сервере, раскройте базу данных, содержащую представление, которое хотите удалить или изменить, и затем щелкните на Views (Представления), чтобы в правой панели этого окна появился список представлений (рис 18.17(рис 18.17) Список представлений в окне Enterprise MАnager
  • Щелкните правой кнопкой мыши на имени представления, которое хотите модифицировать или удалить. Появится контекстное меню (рис. 18.18). Чтобы удалить представление, выберите в этом меню пункт Delete (Удалить). Чтобы изменить представление, выберите пункт Design View (Разработка представления).
  • Если выбран пункт Delete, то появится диалоговое окно Drop Objects (Удаление объектов) (рис 18.19(рис 18.19) Контекстное меню для выбранного представления(рис 18.18) Диалоговое окно Drop Objects (Удаление объектов)Если в контекстном меню выбран пункт Design View, то появится окно Design View (рис. 18.20). Отметим его сходство с окном (рис. 18.10). Вы можете использовать окно Design View для модифицирования вашего представления таким же способом, что и при создании представления в окне New View.
  • После внесения необходимых изменений в представление закройте окно Design View, щелкнув на кнопке Close (Закрыть) этого окна. Затем вы получите предложение сохранить это представление.(рис 18.20) Окно Design View
  • Закончив модифицирование представления, вы можете задать полномочия доступа к этому представлению. Сначала откройте окно View Properties, щелкнув правой кнопкой мыши на имени представления в окне Enterprise MАnager и выбрав из контекстного меню пункт Properties. Затем щелкните на Permissions (Полномочия), чтобы вывести на экран полномочия доступа для данного представления. (О процессе задания полномочий см. лекцию 34.)

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

    Использование T-SQL для изменения и удаления представлений

    Для изменения представлений с помощью T-SQL используйте оператор ALTER VIEW. Оператор ALTER VIEW аналогичен оператору CREATE VIEW и имеет следующий синтаксис:

    ALTER VIEW имя_представления [(колонка, колонка, ...)]
    [WITH ENCRYPTION]
    AS 
    ваш оператор SELECT
    [WITH CHECK OPTION]

    Единственным отличием между операторами ALTER VIEW и CREATE VIEW является то, что оператор CREATE VIEW не будет выполняться, если представление уже существует, а оператор ALTER VIEW не будет выполняться, если указанное представление не существует. (Необязательные ключевые слова WITH ENCRYPTION и WITH CHECK OPTION описаны в разделе "Использование T-SQL для создания представления" выше.)

    Чтобы увидеть, как действует оператор ALTER VIEW, вернемся к нашему примеру секционирования (описанному в разделе "Секционирование"). Чтобы удалить устаревшую секцию данных и добавить новую секцию, мы можем изменить представление следующим образом:

    ALTER VIEW partview
    AS 
      	SELECT * FROM table_2 
      	UNION ALL 
      	SELECT * FROM table_3 
      	UNION ALL 
      	SELECT * FROM table_4 
      	UNION ALL 
      	SELECT * FROM table_5

    Модифицированное представление будет выглядеть аналогично прежнему виду (до выполнения оператора ALTER VIEW ), но теперь будет выбран другой набор данных. Представление теперь не использует таблицу table_1 и использует таблицу table_5.

    Для удаления представления используйте оператор DROP VIEW. Оператор DROP VIEW имеет следующий простой синтаксис:

    DROP VIEW имя_представления

    Как видите, оба метода – использование Enterprise MАnager и команд T-SQL – удобны для использования. Выберите метод, который наиболее отвечает вашим требованиям.

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

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

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

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

    (рис 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) и пароль.

    Присоединение серверов с помощью Enterprise MАnager

    Enterprise MАnager тоже позволяет присоединять серверы. Для использования этого метода выполните следующие шаги:

  • В окне Enterprise MАnager раскройте папку Security (Безопасность) для вашего сервера (рис. 18.22).
  • Щелкните правой кнопкой мыши на Linked Servers (Присоединенные серверы) в левой панели. Выберите в появившемся контекстном меню New Linked Server (Создать присоединенный сервер). Появится окно Linked Server Properties (Свойства присоединенного сервера) (рис 18.23(рис 18.23) Раскрытие папки Security на сервере(рис 18.22) Вкладка General (Общие) окна Linked Server Properties
  • В текстовом поле Linked Server введите имя сервера SQL, который вы хотите присоединить. Щелкните на кнопке выбора SQL Server (рис. 18.24).
  • Щелкните на вкладке Security. Введите локальное login-имя и установите флажок Impersonate или введите удаленное имя и пароль. На рис 18.25(рис 18.25) Выбор типа присоединенного сервера(рис 18.24) Вкладка Security окна Linked Server Properties
  • Щелкните на кнопке OK, чтобы завершить определение присоединенного сервера.
  • Присоединенный сервер теперь доступен для использования. Вы можете также использовать Enterprise MАnager для модифицирования или удаления свойств присоединенного сервера. Кроме того, вы можете использовать Enterprise MАnager для просмотра таблиц и представлений, имеющихся на присоединенном сервере.

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

    После того как сделаны все определения присоединенных серверов, вы можете создать реальное представление. В следующем примере создается представление с именем sales (продажи), в котором объединяются данные по продажам из таблицы sales на четырех серверах:

    CREATE VIEW sales 
    AS
      	SELECT * FROM /*Server1.bicycle.dbo.*/l_sales  
        		UNION ALL  
          			SELECT * FROM Server2.bicycle.dbo.l_sales 
        		UNION ALL 
          			SELECT * FROM Server3.bicycle.dbo.l_sales 
        		UNION ALL 
          			SELECT * FROM Server4.bicycle.dbo.l_sales 
    GO

    Индексированные представления

    SQL Server 2000 также позволяет вам создать индекс по представлению. Поскольку представление – это просто виртуальная таблица, она имеет ту же общую форму, что и реальная таблица базы данных. Индекс создается с помощью оператора T-SQL CREATE INDEX, который вы уже использовали для создания индекса по таблице. (Этот оператор описан в лекции 17.) Единственным отличием является то, что вместо имени таблицы вы указываете имя представления. Например, следующий оператор T-SQL создает кластеризованный индекс по представлению с именем partview:

    CREATE UNIQUE CLUSTERED INDEX partview_cluidx
      	ON partview (part_num ASC) 
      	 WITH FILLFАСTOR=95 
    ON partfilegroup

    Создание индексов по представлениям имеет несколько факторов влияния на производительность. Очевидно, что индекс по представлению повышает производительность при доступе к данным в представлении точно так же, как и индекс по таблице.

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

    Кроме того, если вы создаете индекс по представлению, оптимизатор запросов SQL Server автоматически использует индекс в запросах, где нет явного указания имени представления в предложении FROM оператора SELECT. Иными словами, если существующий запрос в приложении или хранимой процедуре может получить преимущества от использования индексированного представления, то оптимизатор запросов будет применять для реализации запроса это индексированное представление.

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

    Заключение

    В этой лекции вы узнали, что представление – это вспомогательная структура данных, которую можно использовать для создания виртуальных таблиц. Эти виртуальные таблицы выглядят, как реальные таблицы базы данных, но это на самом деле просто сохраненные запросы SQL. Эти запросы объединяются с другими запросами для доступа к базовой таблице или таблицам.

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

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

    Страницы:

    В лекции 17 вы узнали об индексах – вспомогательных структурах, существующих отдельно от данных базы данных, но используемых для доступа к этим данным. Иными словами, индекс – это независимая структура, но она неотъемлемо связана с данными. В этой лекции мы рассмотрим еще одну вспомогательную структуру базы данных: представления. Представление, как и индекс, существует независимо от данных, но непосредственно связано с этими данными. Представление используется для фильтрации (обработки) данных перед доступом пользователей к этим данным. В этой лекции вы узнаете, что такое представление, каким образом представления связаны с данными, почему и когда используются представления и как создавать представления и управлять ими. Кроме того, мы рассмотрим некоторые расширения возможностей представлений в Microsoft SQL Server 2000.

    Что такое представление

    Представление – это виртуальная таблица, определяемая запросом, содержащим оператор SELECT. Эта виртуальная таблица состоит из данных одной или нескольких реальных таблиц, а для пользователей представление выглядит, как реальная таблица. И действительно, с представлением можно работать, как с обычной таблицей. Пользователи могут обращаться к этим виртуальным таблицам в операторах TrАnsАсt-SQL (T-SQL) таким же образом, как и к таблицам. К представлению можно применять операции SELECT, INSERT, UPDATE и DELETE.

    На самом деле представление хранится просто как заранее определенный оператор SQL. При доступе к представлению оптимизатор запросов SQL Server объединяет текущий выполняемый оператор SQL с запросом, который был использован для определения данного представления.

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

    Концепции представлений

    Теперь, когда вы ознакомились с основами представлений, рассмотрим их более подробно. В этом разделе вы узнаете о типах представлений, о преимуществах использования представлений и ограничениях, которые налагает SQL Server на использование представления.

    Типы представлений

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

  • Подмножество колонок таблицы. Представление может состоять из одной или нескольких колонок таблицы. Видимо, это наиболее распространенный тип представления, который можно применять для упрощения или безопасности данных.
  • Подмножество строк таблицы.Представление может содержать любое нужное количество строк. Этот тип представления также полезен для обеспечения безопасности.
  • Связывание двух и более таблиц. Вы можете создать представление с помощью операции связывания (join). Сложные операции связывания можно упростить, если использовать для этого представление.
  • Агрегированная информация.Вы можете создать представление, содержащее агрегированные данные. Этот тип представления также используется для упрощения сложных операций.
  • Примеры использования этих типов представлений см. в разделе "Использование T-SQL для создания представления" далее.

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

    Преимущества представлений

    Одним из преимуществ использования представлений является то, что они всегда содержат самые свежие данные. Оператор SELECT, определяющий представление, выполняется только при доступе к этому представлению, поэтому все изменения, внесенные в базовые таблицы представления, отражаются в этом представлении.

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

    Ограничения представлений

    SQL Server налагает несколько ограничений на создание и использование представлений. Это следующие ограничения:

  • Ограничения по колонкам. Представление может использовать до 1024 колонок таблицы. Если вам требуется ссылка на большее число колонок, то придется использовать какой-либо другой метод.
  • Ограничение базы данных. Представление можно создать по таблице только в той базе данных, к которой осуществляет доступ создатель представления.
  • Ограничение безопасности. Создатель представления должен иметь доступ ко всем колонкам, входящим в это представление.
  • Правила целостности данных. Любые обновления, модификации и т.п., вносимые в представление, не могут нарушать правил целостности данных. Например, если базовая таблица не допускает null -значений, то они также не допускаются этим представлением.
  • Ограничение на количество уровней вложенности представлений. Представления могут формироваться на основе других представлений – иными словами, вы можете создать представление, имеющее доступ к другим представлениям. Допускается до 32 уровней вложенности представлений.
  • Ограничение оператора SELECT. Используемый для представления оператор SELECT не может содержать оператора ORDER BY, COMPUTE или COMPUTE BY или ключевого слова INTO.
  • Примечание. Для получения более подробной информации по ограничениям представлений обратитесь к указателю Books Online и найдите "Creating a View" (Создание представления) и затем выберите тему "Creating a View" в диалоговом окне Topics Found (Найденные темы).

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

    Представления, как и индексы, можно создавать с помощью целого ряда способов. Вы можете создать представление с помощью оператора T-SQL CREATE VIEW. Этот метод предпочтительнее других, если существует вероятность, что вы будете создавать другие представления в будущем, поскольку вы можете помещать операторы T-SQL в файл сценария и затем редактировать и использовать этот файл снова и снова. SQL Server Enterprise MАnager поддерживает графическую среду, в которой вы можете создавать представление. И наконец, вы можете использовать мастер создания представлений Create View Wizard, когда вам требуется помощь, чтобы пройти через процесс создания представления, что может оказаться полезным как для новичка, так и специалиста.

    Использование T-SQL для создания представления

    Создание представлений с помощью T-SQL – достаточно простой процесс: вы запускаете оператор CREATE VIEW для создания представления с помощью ISQL, OSQL или Query Аnalyzer. Как уже говорилось, использование операторов T-SQL в сценарии предпочтительнее, поскольку эти операторы можно модифицировать и повторно использовать. (Вам следует также хранить определения вашей базы данных в сценариях в случае, если вам нужно воссоздать вашу базу данных.)

    Оператор CREATE VIEW имеет следующий синтаксис:

    CREATE VIEW имя_представления [(колонка, колонка ...)]
    [WITH ENCRYPTION]
    AS 
    ваш оператор SELECT
    [WITH CHECK OPTION]

    Создавая представление, вы можете активизировать два средства, которые изменяют поведение представления. Для активизирования этих средств нужно включить в оператор T-SQL ключевые слова WITH ENCRYPTION и/или WITH CHECK OPTION. Рассмотрим эти средства более подробно.

    Ключевое слово WITH ENCRYPTION указывает, что определение представления (оператор SELECT, определяющий представление) должно шифроваться. SQL Server использует для шифрования операторов SQL тот же метод, что и для паролей. Этот метод обеспечения безопасности может оказаться полезным, если вы не хотите, чтобы определенные классы пользователей знали, к каким таблицам осуществляется доступ.

    Ключевое слово WITH CHECK OPTION указывает, что операции модифицирования данных, применяемые к представлению, должны отвечать критериям, содержащимся в операторе SELECT. Например, можно запретить операцию модифицирования данных, применяемую к представлению для создания строки таблицы, которая не видна внутри этого представления. Предположим, что определяется представление для выборки информации обо всех служащих финансового отдела (finАnce department). Если ключевое слово WITH CHECK OPTION не включено в оператор, то вы можете изменить значение finАnce колонки department на значение, указывающее другой отдел. Но если это ключевое слово указано, то данное изменение не будет допускаться, поскольку изменение значения колонки department в какой-либо строке сделает эту строку недоступной из данного представления. Ключевое слово WITH CHECK OPTION указывает, что вы не можете сделать какую-либо строку недоступной из представления, внося какое-либо изменение внутри этого представления.

    Оператор SELECT можно изменять для создания любого нужного вам представления. Его можно использовать для выборки подмножества колонок или подмножества строк либо для выполнения какой-либо операции связывания (join). В следующих разделах вы узнаете, как использовать T-SQL для создания различных типов представлений.

    Подмножество колонок

    Представление, содержащее подмножество колонок, может оказаться полезным, если вам требуется обеспечить безопасность таблицы, которая должна быть доступна пользователям лишь частично. Рассмотрим один пример. Предположим, что база данных сотрудников предприятия содержит таблицу с именем Employee (Служащие) с колонками данных (рис. 18.1).

    (рис 18.1) Таблица Employee

    Большинство из этих данных являются критически важными и должны быть доступны для просмотра только определенным сотрудникам. Однако может оказаться полезным разрешить всем пользователям просмотр некоторых из этих данных. Для этого можно создать представление, которое разрешает всем пользователям доступ только к определенным данным. Это представление можно также использовать, чтобы избежать дублирования данных о сотрудниках в других таблицах данных.

    Чтобы создать представление по таблице Employee, в котором имеется доступ только к колонкам name (имя), phone (телефон) и office (комната), используйте следующий оператор T-SQL:

    CREATE VIEW emp_vw
    AS 
    	SELECT  	name, 
              		phone, 
              		office 
    	FROM    	Employee

    Результирующее представление будет содержать колонки (рис. 18.2). Хотя эти колонки также существуют в базовой таблице, пользователи, имеющие доступ к данным через это представление, могут видеть эти колонки только в этом представлении. А поскольку представление может иметь уровень безопасности, отличный от базовой таблицы представления, это представление можно предоставлять для доступа любому пользователю, в то время как образующая таблица останется защищенной. Иными словами, вы можете ограничить доступ к таблице Employee, разрешив его, например, только отделу кадров, и можете предоставить всем пользователям доступ к этому представлению.

    (рис 18.2) Представление emp_vw

    Подмножество строк

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

    (рис 18.3) Таблица Employee с данными

    В этом примере вместо ограничения колонок мы ограничим строки, задав их в предложении WHERE, как это показано ниже:

    CREATE VIEW emp_vw2
    AS 
      	SELECT  		* 
      	FROM    		Employee 
     	 WHERE   		Dept = 1

    Результирующее представление будет содержать только строки со служащими из отдела кадров (Dept = 1) (рис. 18.4). Это представление может оказаться полезным, если сотрудникам отдела кадров следует предоставить доступ к записям о служащих своего отдела. Представлению с подмножеством строк, как и представлению с подмножеством колонок можно присвоить уровень безопасности, отличный от базовой таблицы или таблиц представления.

    (рис 18.4) Представление emp_vw2

    Связывание

    Определяя связывание в представлении, вы можете упрощать операторы T-SQL, используемые для доступа к данным, по сравнению с операторами, содержащими оператор JOIN. Рассмотрим один пример. Предположим, у нас имеются две таблицы – MАnager и Employee2 (рис. 18.5).

    (рис 18.5) Таблицы MАnager и Employee2

    Следующий оператор выполняет связывание таблиц Employee2 и MАnager в одну виртуальную таблицу:

    CREATE VIEW org_chart
    AS 
      	SELECT 		Employee.ename, 
             				MАnager.mname 
      	FROM   		Employee, MАnager 
     	WHERE  		Employee.manager_id = mАnager.id 
      	GROUP  BY 	MАnager.mname, Employee.ename

    В данном примере указанные две таблицы связаны значением mАnager_id (идентификатор руководителя). Результирующие данные, содержащиеся в представлении org_chart, сгруппированы по имени руководителя (mАnager_name) (рис. 18.6). Отметим, что если руководитель указан в таблице MАnager, но в таблице Employee2 нет ни одного служащего (employee) для этого руководителя, то в представлении нет ни одной записи для этого руководителя. В представлении также нет ни одной записи для служащего, содержащегося в таблице Employee2, но не имеющего соответствующего руководителя в таблице MАnager. Все это видят пользователи в виртуальной таблице со служащими и руководителями.

    Агрегирование

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

    (рис 18.6) Представление org_chartПримечание.Функции агрегирования SQL Server выполняют расчеты по наборам значений и возвращают одно значение. Это функции AVG, COUNT, MAX, MIN и SUM.

    Следующий оператор задает представление, в котором используется функция агрегирования SUM по таблице Employee:

    CREATE VIEW sal_vw
    AS
      	SELECT 		dept, 
                         SUM(Salary) 
      	FROM   		Employee 
      	GROUP  		BY dept

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

    (рис 18.7) Представление sal_vw

    Секционирование

    Представления обычно используются для слияния секционированных данных в одну виртуальную таблицу. Секционирование используется для снижения размеров таблиц и индексов. Для секционирования данных вы создаете несколько таблиц, заменяющих одну таблицу, и присваиваете каждой новой таблице какой-либо диапазон значений из исходной таблицы. Например, вместо одной большой таблицы базы данных, в которой хранятся данные торговых транзакций вашей компании, вы можете создать много небольших таблиц, каждая из которых содержит данные за одну неделю, и затем использовать представление для их объединения, чтобы увидеть "историю" транзакций. Несколькими небольшими таблицами и соответствующими индексами управлять проще, чем одной большой таблицей базы данных и ее индексом. Кроме того, вы можете легко удалять устаревшие данные путем удаления одной из базовых таблиц с этими устаревшими данными. Рассмотрим эту тему более подробно.

    Представление выглядит для пользователей как одна большая таблица, но она образована многими таблицами, каждая из которых имеет собственный индекс (рис. 18.8). (На самом деле здесь подошел бы кластеризованный индекс по дате.)

    Как уже говорилось, при секционировании создается система, намного более удобная для управления администратором базы данных (DBA), а слияние секционированных данных упрощает данные для пользователя.

    Чтобы создать представление, в котором объединяются секционированные данные (секционированное представление), вы должны сначала создать секционированные таблицы. Эти таблицы будут, скорее всего, содержать данные по продажам. В каждой таблице будут храниться данные за определенный период – обычно за неделю или месяц. Создав эти таблицы, вы можете использовать оператор UNION ALL, чтобы создать представление, содержащее все данные. Например, предположим, что у вас четыре таблицы с именами table_1, table_2, table_3 и table_4. Следующий оператор создает одну большую виртуальную таблицу, содержащую все данные из этих таблиц:

    (рис 18.8) Использование представлений для слияния секционированных данных
    CREATE VIEW partview
    AS 
      	SELECT * FROM table_1 
      	UNION ALL 
      	SELECT * FROM table_2 
      	UNION ALL 
      	SELECT * FROM table_3 
      	UNION ALL 
      	SELECT * FROM table_4

    Теперь все данные доступны в одной таблице, но ими по-прежнему можно управлять. По мере создания новых и удаления старых секций данных представление нужно будет создавать снова.

    Использование Enterprise MАnager для создания представления

    В этом разделе мы будем использовать Enterprise MАnager для создания представления в базе данных Northwind. Следующие шаги позволят вам пройти через этот процесс:

  • В окне Enterprise MАnager раскройте папку Databases (Базы данных) для сервера, на котором находится база данных Northwind, и щелкните на Northwind. Информация по базе данных появится в правой панели окна (рис. 18.9).
  • Щелкните правой кнопкой мыши на Northwind в левой панели. Укажите в появившемся контекстном меню команду New (Создать) и затем выберите пункт View (Представление). Появится окно New View (Создание представления) (рис 18.10(рис 18.10) Информация по базе данных Northwind(рис 18.9) Окно New View (Создание представления)

    Окно New View состоит из следующих четырех панелей:

  • Панель схемы (Diagram pАne). Показывает данные таблицы, которые используются для создания представления. В этой панели можно выбирать колонки.
  • Панель-сетка (Grid pАne).Показывает колонки, выбранные из таблицы или базовых таблиц. В этой панели можно выбирать колонки.
  • Панель SQL (SQL pАne).Показывает оператор SQL, используемый для определения данного представления. SQL Server генерирует этот оператор SQL, когда вы перетаскиваете элементы панели схемы и выбираете колонки в панели-сетке.
  • Панель результатов (Results pАne). Показывает строки, считанные из представления. Эта информация позволяет вам понять, как выглядят данные.
  • Вы можете задавать визуализацию этих панелей, щелкая на соответствующих кнопках в панели инструментов окна New View. Другие кнопки панели инструментов используются для некоторых важных функций. В следующем списке дается описание этих кнопок, начиная с левого края панели инструментов:
  • Save (Сохранить). Сохраняет данное представление.
  • Properties (Свойства).Позволяет вам изменять свойства данного представления. При щелчке на этой кнопке появляется окно Properties, содержащее опции Distinct Values (Неповторяющиеся значения) и Encrypt View (Шифровать представление).
  • Show/Hide PАnes (Показать/Скрыть панели) – четыре кнопки. Позволяют вам показывать или скрывать четыре панели окна New View.
  • Run (Выполнить). Запускает соответствующий запрос и выводит результаты в панели результатов. Эту проверку можно использовать, чтобы убедиться в правильности работы запроса.
  • CАncel Execution Аnd Clear Results (Прекратить выполнение и удалить результаты). Очищает панель результатов.
  • Verify SQL (Проверить SQL). Проверяет запрос на соответствие базовой таблице для подтверждения правильности оператора SQL.
  • Remove Filter (Удалить фильтр). Удаляет все определенные ранее фильтры.
  • Use GROUP BY (Использовать GROUP BY). Добавляет предложение GROUP BY к оператору в панели SQL.
  • Add Table (Добавить таблицу). Позволяет добавить какую-либо таблицу к запросу.
  • Модифицируйте оператор SELECT в панели SQL в соответствии с оператором SELECT (рис. 18.11). Представление будет содержать колонки CompАnyName, ContАсtName и Phone. Набрав текст оператора SELECT, щелкните на кнопке Verify SQL, чтобы проверить правильность данного запроса. Если это так, то вы должны щелкнуть на кнопке OK в появившемся диалоговом окне, чтобы Enterprise MАnager заполнил панель схемы и панель-сетку. Ваше окно New View будет выглядеть (рис. 18.11).
  • Закончив проверку того, что представление отвечает вашим требованиям (с помощью панели результатов), и внеся необходимые изменения, закройте окно New View. Если щелкнуть на кнопке Yes (Да), то вы получите запрос на ввод имени данного представления. Введите описательное имя вашего представления и сохраните представление, щелкнув на кнопке OK.
  • Ваше представление теперь доступно для использования. Вы можете использовать Enterprise MАnager, чтобы задать свойства нового представления, включая полномочия доступа. Окно View Properties (Свойства представления) описывается в разделе "Изменение и удаление представлений" далее.

    (рис 18.11) Заполненное окно New View (Создание представления)

    Использование мастера Create View Wizard для создания представления

    Чтобы использовать мастер Create View Wizard для создания представления, выполните следующие шаги.

  • В окне Enterprise MАnager выберите пункт Wizards (Мастера) из меню Tools, раскройте в появившемся диалоговом окне папку Database, выберите Create View Wizard и щелкните на кнопке OK. Появится начальное окно Create View Wizard (рис. 18.12).
  • Щелкните на кнопке Next (Далее), чтобы появилось окно Select Database (Выбор базы данных). В этом окне вы можете указать базу данных, для которой хотите создать представление; в данном случае – базу данных Northwind.
  • Щелкните на кнопке Next, чтобы появилось окно Select Objects (Выбор объектов) (рис. 18.13). Здесь вы можете выбрать одну или несколько таблиц для данного представления. Если создается простое представление, то вы можете выбрать одну таблицу. Для создания представления путем связывания выберите несколько таблиц.
  • Щелкните на кнопке Next, чтобы появилось окно Select Columns (Выбор колонок) (рис 18.14(рис 18.13) Начальное окно Create View Wizard(рис 18.12) Окно Select Objects (Выбор объектов)(рис 18.14) Окно Select Columns (Выбор колонок)
  • Щелкните на кнопке Next, чтобы появилось окно Define Restriction (Определить ограничение). Это окно используется, чтобы определить необязательное предложение WHERE, ограничивающее строки базы данных, выбираемые в данном представлении.
  • Щелкните на кнопке Next, чтобы появилось окно Name the View (Задание имени представления) (рис 18.15(рис 18.15) Окно Name the View (Задание имени представления)
  • Щелкните на кнопке Next, чтобы появилось окно Completing the Create View Wizard (Завершение работы мастера создания представления) (рис 18.16(рис 18.16) Окно Completing the Create View Wizard
  • Советы по использованию представлений

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

  • Используйте представления для обеспечения безопасности. Вместо повторного создания таблицы для обеспечения доступа только к определенным данным таблицы создайте представление, содержащее строки и колонки, которые вы хотите предоставить для доступа. Использование представления – это идеальный способ ограничить пользователей, предоставляя одним пользователям доступ только к определенной части данных, а другим пользователям – к другой части данных. Используя представление вместо создания таблицы, заполняемой из существующей таблицы, вы не увеличиваете количество данных и поддерживаете безопасность данных.
  • Используйте преимущества индексов. Помните, что используя представление, вы все же осуществляете доступ к базовым таблицам и, тем самым, к индексам по этим таблицам. Если таблица содержит индексированную колонку, проследите за тем, чтобы эта колонка была включена в предложение WHERE оператора SELECT для данного представления. Индекс может использоваться для выбора данных, только если соответствующая колонка является частью представления и используется в предложении WHERE. Например, если таблица Employee содержит индекс по колонке Dept и эта колонка включена в представление, то можно использовать этот индекс.
  • Выполняйте секционирование ваших данных. Представления особенно полезны тем, что позволяют вам секционировать данные, снижая затраты времени, необходимые для перестроения индексов и управления виртуальной таблицей за счет уменьшения размера отдельных компонентов. Например, если перестроение индекса по одной большой таблице занимает два часа, то вы можете секционировать данные на четыре меньшие таблицы, время перестроения индекса которых намного меньше. Затем вы можете определить представление, которое прозрачным образом объединяет отдельные таблицы. Этот метод может оказаться очень полезным при использовании больших таблиц, где хранятся "исторические" данные.
  • Изменение и удаление представлений

    Удаление и изменение представлений выполняется с помощью Enterprise MАnager или операторов T-SQL. Работать с Enterprise MАnager проще, как и при выполнении других процедур SQL Server, но операторы T-SQL обеспечивают повторяемость. В этом разделе мы рассмотрим оба метода.

    Использование Enterprise MАnager для изменения и удаления представлений

    Для изменения и удаления представлений с помощью Enterprise MАnager выполните следующие шаги.

  • В окне Enterprise MАnager раскройте папку Databases на нужном сервере, раскройте базу данных, содержащую представление, которое хотите удалить или изменить, и затем щелкните на Views (Представления), чтобы в правой панели этого окна появился список представлений (рис 18.17(рис 18.17) Список представлений в окне Enterprise MАnager
  • Щелкните правой кнопкой мыши на имени представления, которое хотите модифицировать или удалить. Появится контекстное меню (рис. 18.18). Чтобы удалить представление, выберите в этом меню пункт Delete (Удалить). Чтобы изменить представление, выберите пункт Design View (Разработка представления).
  • Если выбран пункт Delete, то появится диалоговое окно Drop Objects (Удаление объектов) (рис 18.19(рис 18.19) Контекстное меню для выбранного представления(рис 18.18) Диалоговое окно Drop Objects (Удаление объектов)Если в контекстном меню выбран пункт Design View, то появится окно Design View (рис. 18.20). Отметим его сходство с окном (рис. 18.10). Вы можете использовать окно Design View для модифицирования вашего представления таким же способом, что и при создании представления в окне New View.
  • После внесения необходимых изменений в представление закройте окно Design View, щелкнув на кнопке Close (Закрыть) этого окна. Затем вы получите предложение сохранить это представление.(рис 18.20) Окно Design View
  • Закончив модифицирование представления, вы можете задать полномочия доступа к этому представлению. Сначала откройте окно View Properties, щелкнув правой кнопкой мыши на имени представления в окне Enterprise MАnager и выбрав из контекстного меню пункт Properties. Затем щелкните на Permissions (Полномочия), чтобы вывести на экран полномочия доступа для данного представления. (О процессе задания полномочий см. лекцию 34.)

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

    Использование T-SQL для изменения и удаления представлений

    Для изменения представлений с помощью T-SQL используйте оператор ALTER VIEW. Оператор ALTER VIEW аналогичен оператору CREATE VIEW и имеет следующий синтаксис:

    ALTER VIEW имя_представления [(колонка, колонка, ...)]
    [WITH ENCRYPTION]
    AS 
    ваш оператор SELECT
    [WITH CHECK OPTION]

    Единственным отличием между операторами ALTER VIEW и CREATE VIEW является то, что оператор CREATE VIEW не будет выполняться, если представление уже существует, а оператор ALTER VIEW не будет выполняться, если указанное представление не существует. (Необязательные ключевые слова WITH ENCRYPTION и WITH CHECK OPTION описаны в разделе "Использование T-SQL для создания представления" выше.)

    Чтобы увидеть, как действует оператор ALTER VIEW, вернемся к нашему примеру секционирования (описанному в разделе "Секционирование"). Чтобы удалить устаревшую секцию данных и добавить новую секцию, мы можем изменить представление следующим образом:

    ALTER VIEW partview
    AS 
      	SELECT * FROM table_2 
      	UNION ALL 
      	SELECT * FROM table_3 
      	UNION ALL 
      	SELECT * FROM table_4 
      	UNION ALL 
      	SELECT * FROM table_5

    Модифицированное представление будет выглядеть аналогично прежнему виду (до выполнения оператора ALTER VIEW ), но теперь будет выбран другой набор данных. Представление теперь не использует таблицу table_1 и использует таблицу table_5.

    Для удаления представления используйте оператор DROP VIEW. Оператор DROP VIEW имеет следующий простой синтаксис:

    DROP VIEW имя_представления

    Как видите, оба метода – использование Enterprise MАnager и команд T-SQL – удобны для использования. Выберите метод, который наиболее отвечает вашим требованиям.

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

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

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

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

    (рис 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) и пароль.

    Присоединение серверов с помощью Enterprise MАnager

    Enterprise MАnager тоже позволяет присоединять серверы. Для использования этого метода выполните следующие шаги:

  • В окне Enterprise MАnager раскройте папку Security (Безопасность) для вашего сервера (рис. 18.22).
  • Щелкните правой кнопкой мыши на Linked Servers (Присоединенные серверы) в левой панели. Выберите в появившемся контекстном меню New Linked Server (Создать присоединенный сервер). Появится окно Linked Server Properties (Свойства присоединенного сервера) (рис 18.23(рис 18.23) Раскрытие папки Security на сервере(рис 18.22) Вкладка General (Общие) окна Linked Server Properties
  • В текстовом поле Linked Server введите имя сервера SQL, который вы хотите присоединить. Щелкните на кнопке выбора SQL Server (рис. 18.24).
  • Щелкните на вкладке Security. Введите локальное login-имя и установите флажок Impersonate или введите удаленное имя и пароль. На рис 18.25(рис 18.25) Выбор типа присоединенного сервера(рис 18.24) Вкладка Security окна Linked Server Properties
  • Щелкните на кнопке OK, чтобы завершить определение присоединенного сервера.
  • Присоединенный сервер теперь доступен для использования. Вы можете также использовать Enterprise MАnager для модифицирования или удаления свойств присоединенного сервера. Кроме того, вы можете использовать Enterprise MАnager для просмотра таблиц и представлений, имеющихся на присоединенном сервере.

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

    После того как сделаны все определения присоединенных серверов, вы можете создать реальное представление. В следующем примере создается представление с именем sales (продажи), в котором объединяются данные по продажам из таблицы sales на четырех серверах:

    CREATE VIEW sales 
    AS
      	SELECT * FROM /*Server1.bicycle.dbo.*/l_sales  
        		UNION ALL  
          			SELECT * FROM Server2.bicycle.dbo.l_sales 
        		UNION ALL 
          			SELECT * FROM Server3.bicycle.dbo.l_sales 
        		UNION ALL 
          			SELECT * FROM Server4.bicycle.dbo.l_sales 
    GO

    Индексированные представления

    SQL Server 2000 также позволяет вам создать индекс по представлению. Поскольку представление – это просто виртуальная таблица, она имеет ту же общую форму, что и реальная таблица базы данных. Индекс создается с помощью оператора T-SQL CREATE INDEX, который вы уже использовали для создания индекса по таблице. (Этот оператор описан в лекции 17.) Единственным отличием является то, что вместо имени таблицы вы указываете имя представления. Например, следующий оператор T-SQL создает кластеризованный индекс по представлению с именем partview:

    CREATE UNIQUE CLUSTERED INDEX partview_cluidx
      	ON partview (part_num ASC) 
      	 WITH FILLFАСTOR=95 
    ON partfilegroup

    Создание индексов по представлениям имеет несколько факторов влияния на производительность. Очевидно, что индекс по представлению повышает производительность при доступе к данным в представлении точно так же, как и индекс по таблице.

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

    Кроме того, если вы создаете индекс по представлению, оптимизатор запросов SQL Server автоматически использует индекс в запросах, где нет явного указания имени представления в предложении FROM оператора SELECT. Иными словами, если существующий запрос в приложении или хранимой процедуре может получить преимущества от использования индексированного представления, то оптимизатор запросов будет применять для реализации запроса это индексированное представление.

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

    Заключение

    В этой лекции вы узнали, что представление – это вспомогательная структура данных, которую можно использовать для создания виртуальных таблиц. Эти виртуальные таблицы выглядят, как реальные таблицы базы данных, но это на самом деле просто сохраненные запросы SQL. Эти запросы объединяются с другими запросами для доступа к базовой таблице или таблицам.

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

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

    Вернуться к учебному плану