SQL Server 2000: основы работы с представлениями

ПУБЛИКАЦИИ  

По материалам статьи Navneeth Diwaker Naik SQL Server 2000: View Basics
Перевод Виталия Степаненко

Представления - это не что иное, как сохраненные команды SQL, которые иногда называют "виртуальными таблицами". Учтите, что представления не могут хранить данные (кроме индексированных представлений); они только ссылаются на данные, присутствующие в таблицах.

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


CREATE VIEW View_Name
AS
SELECT Statement       
GO

Есть две важные опции, которые могут быть использованы при создании представления. Это SCHEMABINDING и ENCRYPTION. Мы рассмотрим каждую из них подробно, но сначала разберем пример создания обычного представления без опций.


USE Northwind
GO
CREATE VIEW vwSample
As
SELECT CustomerID, CompanyName, ContactName FROM CUSTOMERS
GO

Этот скрипт создает представление vwSample. Теперь вместо использования полной команды SELECT можно воспользоваться следующей командой:

SELECT * from vwSample

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

DROP VIEW vwSample

[В начало]

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

Создание представления с опцией SCHEMABINDING блокирует таблицы, на которые ссылается представление и запрещает любые изменения схемы этих таблиц.

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

  • объекты должны указываться вместе с именами их владельцев (имя из двух частей);
  • использование SELECT * не допускается.

Ниже приведен пример представления с опцией SCHEMABINDING:


CREATE VIEW vwSample
With SCHEMABINDING
As
SELECT
    CustomerID,
    CompanyName,
    ContactName
FROM DBO.CUSTOMERS -- Имя из двух частей (владелец.объект)
GO

Эта команда создает представление vwSample. После создания представления попробуйте изменить таблицу CUSTOMERS, это не удастся. Это результат опции SCHEMABINDING. Т.к. vwSample ссылается на таблицу CUSTOMERS, то вы не можете выполнять команду ALTER на таблице CUSTOMERS.

Не забудьте удалить представление.

DROP VIEW vwSample

[В начало]

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

Эта опция зашифровывает определение представления. Пользователи не смогут просмотреть определение представления после его создания.


USE NORTHWIND
GO
CREATE VIEW vwSample
With ENCRYPTION
As
SELECT
    CustomerID,
    CompanyName,
    ContactName
FROM DBO.CUSTOMERS
GO
SELECT *
FROM SYSCOMMENTS
WHERE ID = (SELECT ID FROM SYSOBJECTS WHERE XTYPE = 'V' AND NAME = 'vwSample')

Определение представления будет сохранено в зашифрованном формате в системной таблице syscomments.

Внимание: после шифрования определения расшифровать его уже нельзя. Поэтому будьте очень осторожны при использовании опции ENCRYPTION.

Не забудьте удалить представление.

DROP VIEW vwSample

[В начало]

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

SQL SERVER 2000 позволяет создавать индексы для представлений. Предыдущие версии SQL SERVER не позволят делать это. Но нужно отметить одну важную особенность - первый индекс представления должен обязательно быть уникальным и кластерным. SQL SERVER 2000 не позволит вам создать любой другой индекс, пока представление не будет иметь уникальный кластерный индекс.

Давайте рассмотрим пример индексированного представления:


CREATE VIEW vwSample
As
SELECT
    CustomerID,
    CompanyName,
    ContactName
FROM DBO.CUSTOMERS
GO
CREATE UNIQUE CLUSTERED INDEX indClustered
ON NORTHWIND.DBO.VWSAMPLE (CUSTOMERID)
GO

Эта команда создает уникальный кластерный индекс для представления.

Не забудьте удалить представление.

DROP VIEW vwSample

[В начало]

Варианты использования представлений

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

Следующий скрипт создаст таблицу TEST и представление vwSample.


USE NORTHWIND
GO
CREATE TABLE [Test]
(
TestID INT,
TestName VARCHAR (100)
)
GO
CREATE VIEW vwTest
As
SELECT
    TestID, TestName
FROM Test
GO

Теперь вставим данные в таблицу Test, используя представление. Выполните следующую команду. Она вставит данные в таблицу Test.


INSERT INTO vwTest
VALUES (1, 'Test 1')
SELECT * from Test
TestID           TestName
-------------------------------
1                Test 1

Теперь обновим данные, используя то же представление.


UPDATE vwTest
SET TestName = 'New Value'
WHERE TestID = 1
SELECT * from Test
TestID           TestName
--------------------------------
1                New Value

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

Не забудьте удалить представление.

DROP VIEW vwTest

[В начало]

Триггер INSTEAD OF на представлении

SQL SERVER 2000 позволяет создавать триггеры на представлениях. Предыдущие версии SQL SERVER не позволяли делать это. Это является новой особенностью SQL SERVER 2000. Но помните, что вы можете создать только триггеры INSTEAD OF на представлениях.


CREATE VIEW vwSample
As
SELECT
    CustomerID,
    CompanyName,
    ContactName
FROM DBO.CUSTOMERS
GO

[В начало]

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

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

  • нельзя использовать SELECT INTO в представлении;
  • временные таблицы не могут использоваться в представлении;
  • параметризованные представления не существуют, т.е. вы не можете передавать параметры в представления;
  • выражения COMPUTE & COMPUTE BY не могут использоваться в представлении.

[В начало]

Представления и пользовательские функции

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

[В начало]

Заключение

Представления - это не что иное, как сохраненные команды SQL. Пользователь может вставлять, удалять или обновлять данные, используя представления в SQL SERVER 2000. Индексы и триггеры также могут быть созданы для представлений, но с ограничением - первый индекс должен быть UNIQUE CLUSTERED INDEX, а триггер должен быть типа INSTEAD OF. Представления и пользовательские функции предназначены практически для одной и той же цели с той лишь разницей, что пользовательские функции могут иметь параметры, а представления нет.

Navneeth Diwaker Naik (navneeth_naik@satyam.com) является сотрудником Satyam Computers Services Limited, Hyderabad, Andhra Pradesh (Индия).

[В начало]


Перевод: Виталия Степаненко  2004г.

ПУБЛИКАЦИИ

Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz