Скачиваний:
102
Добавлен:
02.05.2014
Размер:
2.3 Mб
Скачать

9.6. Поддержка представлений в языке sql

В этом разделе будут рассмотрены средства поддержки представлений, существую­щие в языке SQL (к сожалению, на данный момент язык SQL не предусматривает под­держки моментальных снимков). Прежде всего, рассмотрим синтаксис оператора созда­ния представления CREATE VIEW.

CREATE VIEW <имя представление AS <табличное выражение> { WITH [ <квалификатор> } CHECK OPTION ] ;

Здесь параметр <квалификатор> может принимать значение CASCADED или LOCAL, при­чем значение CASCADED принимается по умолчанию (и фактически это единственная ра­зумная опция, как подробно объясняется в [4.19]), поэтому здесь опцию LOCAL мы рас­сматривать не будем.

Пояснения

  1. Значение параметра <та6личное выражение> представляет собой определение представления. Формат этого выражения подробно описывается в приложении А.

  2. Фраза WITH CHECK OPTION, если она указана, означает, что операции вставки (INSERT) и обновления (UPDATE) для данного представлении будут отменены в слу­чае нарушения ограничений целостности, указанных в определении представления. Поэтому заметьте, что подобные операции будут завершаться выдачей ошибки лишь в том случае, когда определитель WITH CHECK OPTION указан явно, т.е. по умолчанию любые операции вставки и обновления кортежей будут завершаться ус­пешно. На основании выводов, сделанных в разделе 9.4, можно заключить, что по­добное поведение логически некорректно. Поэтому настоятельно рекомендуется всегда указывать опцию WITH CHECK OPTION в определениях любых создаваемых представлений9 [9.8].

Примеры

1. CREATE VIEW SUPPLIER

AS SELECT S.St, S.STATUS, S.CITY FROM S

WHERE S.STATUS > 15 WITH CHECK OPTION ;

2. CREATE VIEW REDPART

9 Безусловно, речь идет только об обновляемых представлениях. Как мы убедимся позже, в языке SOL представления часто не являются обновляемыми и наличие опции WITH CHECK OPTION в таких случаях недопустимо в соответствии с требованиями языка SOL.


AS SELECT P.Pt, P.NAME, P.WEIGHT AS WT, P.CITY

FROM P

WHERE P.COLOR = 'Red' WITH CHECK OPTION ;

3. CREATE VIEW PQ

AS SELECT SP.Pt, SUM ( SP.QTY ) AS TOTQTY FROM SP GROUP BY SP.Pt ;

В отличие от приведенного выше аналога этого представления (см. в разделе 9.1 подраздел "Дополнительные примеры"), данное представление не будет включать строк для деталей, которые не поставляются ни одним из поставщиков. Подробно­сти приводятся в обсуждении примера 7.7.8 в главе 7.

4. CREATE VIEW CITY_PAIR

AS SELECT DISTINCT S.CITY AS SCITY, P.CITY AS PCITY FROM S, SP, P WHERE S.St = SP.St AND SP.Pt = P.Pt ;

5. CREATE VIEW HEAVY_REDPART

AS SELECT RP.Pt, RP.PNAME, RP.WT, RP.CITY

FROM REDPART AS RP

WHERE RP.WT > 12.0 WITH CHECK OPTION ;

Существующее представление может быть удалено с помощью SQL-оператора DROP VIEW, синтаксис которого приведен ниже.

DROP VIEW <имя представления> <режим> ;

В этом операторе (как и в SQL-операторах DROP TABLE и DROP DOMAIN) значением па­раметра <режим> могут быть опции RESTRICT и CASCADE. Если указана опция RESTRICT и на удаляемое представление имеются ссылки в определениях других представлений или ограничений целостности, то данная операция DROP будет признана ошибочной. Если указана опция CASCADE, то выполнение данной операции DROP завершится успешно и бу­дет сопровождаться "каскадным" удалением всех представлений и ограничений целост­ности, определения которых ссылаются на данное удаляемое представление.

Выборка данных из представлений

Как было показано в разделе 9.3, для всех операций выборки данных из любых пред­ставлений в текущей версии стандарта языка SQL (SQL/92) гарантируется корректность выполнения. К сожалению, этого нельзя сказать о некоторых современных программных продуктах, как и о предыдущих версиях стандарта языка SQL (см. упр. 9.14).

Обновление данных в представлениях

Стандарт SQL/92 поддерживает весьма ограниченный набор операций обновле­ния данных в представлениях. В качестве обновляемых, в основном, рассматрива­ются только те представления, которые являются производными от одной базовой таблицы и описаны с использованием некоторой комбинации операций выборки и

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

Ниже приведено более точное изложение правил обновляемости представлений в со­ответствии со стандартом языка SQL (этот список взят из [4.19], хотя здесь он несколько упрощен). Стандартом языка SQL предполагается, что представление является обнов­ляемым только в том случае, если выполнены все следующие условия.

  1. Табличное выражение, определяющее область видимости представления, должно быть выражением выборки, т.е. в него не должны непосредственно входить такие ключевые слова, как JOIN, UNION, INTERSECT и EXCEPT.

  2. Предложение SELECT в выражении выборки не должно непосредственно содержать ключевое слово DISTINCT.

  3. Каждый выбираемый элемент в предложении SELECT (после любых требуемых расширений этого списка, заданных шаблоном "звездочка" (*)) должен быть именем столбца (возможно, уточненным и при необходимости сопровождае­мым фразой AS), представляющим простую ссылку на столбец исходной табли­цы (см. п. 5).

  4. Предложение FROM в выражении выборки должно содержать ровно одну ссылку на таблицу.

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

Замечание. Таблица, которую задает ссылка, является единственной исходной таб­лицей для рассматриваемого обновляемого представления (см. п. 3).

  1. Заданное выражение выборки не должно включать предложения WHERE с подзапро­сом, в котором содержится предложение FROM, ссылающееся на ту же таблицу, что и основное предложение FROM, рассмотренное в п. 4.

  2. Выражение выборки не должно включать предложения GROUP BY.

  3. Выражение выборки не должно включать предложения HAVING.

Сделаем пару замечаний к перечисленным правилам.

  1. Подход к обновляемости представлений в языке SQL следует принципу "все или ничего". Это значит, что по отношению к любому представлению все три операции, INSERT, UPDATE и DELETE, либо можно применять, либо нельзя. На­пример, в языке SQL невозможна ситуация, когда к некоторому представлению допускается применение операции DELETE, но запрещено применять операцию INSERT (хотя отдельные коммерческие программные продукты такую возмож­ность поддерживают).

  2. В языке SQL операция UPDATE либо применима к данному представлению, либо нет. Иначе говоря, в языке SQL недопустима ситуация, когда одни столбцы пред­ставления являются обновляемыми, а другие — нет (хотя некоторые коммерческие программные продукты в этом отношении пошли дальше стандарта).

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]