- •Часть 5
- •Глава 17 Представления
- •17.1. Введение
- •17.2. Для чего нужны представления
- •17.3. Определение данных
- •17.4. Манипуляции с данными: операции выборки
- •17.5. Манипуляции с данными: операции обновления
- •17.6. Обновление операций объединения, пересечения и вычитания
- •Объединение
- •Пересечение
- •17.7. Обновление представлений других видов
- •17.8. Снимки
- •17.9. Поддержка sql
- •17.10. Резюме
17.9. Поддержка sql
В этом разделе будут подытожены средства поддержки языка SQL для представлений (к сожалению, на данный момент SQL не поддерживает снимков данных в какой-либо форме). Прежде всего рассмотрим синтаксис инструкции create view:
CREATE VIEW представление AS та6личное_выражение [ WITH CHECK OPTION ] ;
Пояснения:
1. Выражение табличное_выражение определяет представление. Подобные выражения уже описывались ранее в этой книге.
2. Оператор with check option (если он указан) означает, что операции insert и update на представлении будут отменяться, если они будут нарушать условие, определяющее представление. Поэтому заметьте, что подобные операции будут завершаться неудачей (только когда указан оператор with check option), по умолчанию операции вставки и обновления кортежей будут завершаться успешно. Из сказанного можно сделать вывод, что подобный результат логически не корректен. Поэтому настоятельно рекомендуется для обновляемых представлений всегда указывать оператор with check option. (Конечно, здесь обновляемые представления рассматривается в контексте стандарта SQL (см. далее). Действительно, оператор with check option нельзя применять для представлений, не являющихся обновляемыми.)
Замечание. Оператор with check option обладает множеством нюансов, обсуждение которых выходит за рамки этой книги. Более детально, с примерами этот оператор описан в [8.5], а критический обзор понятия дан в [17.4].
Примеры:
1. CREATE VIEW REDPARTS
AS SELECT P.P#, P.NAME, P.WEIGHT, P.CITY FROM P WHERE P.COLOR = 'Red'
WITH CHECK OPTION ;
2. CREATE VIEW LREDPARTS
AS SELECT REDPARTS. P#, REDPARTS. WEIGHT FROM REDPARTS
WHERE REDPARTS.CITY = 'London'
WITH CHECK OPTION ;
3. CREATE VIEW CITYPAIRS
AS SELECT DISTINCT S.CITY AS SCITY, P. CITY AS PCITY FROM S, SP, P
WHERE S.S# = SP.S#
AND SP.P# = P.P# ;
4. CREATE VIEW PQ
AS SELECT SP.P#, SUM ( SP.QTY ) AS ТОТQТУ FROM SP GROUP BY SP.P# ;
Существующее представление может быть уничтожено с помощью операции drop view, синтаксис которой показан ниже.
DROP VIEW представление опция ;
В этом операторе (как и в операторах drop table и drop domain) опция— это операторы restrict или cascade. Если используется оператор restrict и на данное представление существуют ссылки из определений других представлений или из условий целостности, то операция drop завершится неудачей. Если используется оператор cascade, то операция drop будет завершена успешно и приведет к каскадному удалению всех представлений и ограничений целостности, определения которых ссылаются на удаляемое представление.
Операции выборки на представлениях. Как было показано выше в этой главе, все операции выборки на всех представлениях работают корректно в текущей версии стандарта SQL (версия SQL/92). К сожалению, это утверждение нельзя применить к некоторым современным программным продуктам, впрочем, как и к предыдущим версиям стандарта SQL.
Операции обновления представлений. Стандарт SQL поддерживает весьма ограниченный набор операций обновления представлений. В основном как обновляемые рассматриваются только те представления, которые получены на основе одной таблицы базы данных с помощью некоторых комбинаций операций выборки и проекции. Более того, даже этот простой тип представлений трактуется неправильно. Причина заключается в том, что в стандарте SQL недостаточно развиты средства работы с предикатами отношений, в частности, таблицы стандарта SQL могут содержать дублирующиеся строки.
Ниже более точно изложен критерий обновляемости представлений в стандарте SQL (этот список взят из [8.5]). Стандарт SQL предполагает, что представление является обновляемым тогда и только тогда, когда для него истинны утверждения 1-8. |,
1. Табличное выражение, которое определяет область действия представления, должно быть выражением выборки. Следовательно, в это выражение не должны входить операторы join, union, intersect и except.
2. Оператор select в табличном выражении не должен непосредственно содержать ключевого слова distinct.
3. Каждый элемент выборки в операторе select состоит из классифицированного имени столбца (возможно, сопровождаемого инструкцией as), который представляет простую ссылку на столбец исходной таблицы (см. пункт 5).
4. Оператор FROM в выражении выборки содержит единственную ссылку на таблицу.
5. Ссылка на таблицу представляет собой либо таблицу базы данных, либо обновляемое представление. Замечание. Таблица, указанная с помощью ссылки, является единственной исходной таблицей для рассматриваемого представления.
6. В выражение выборки не входит оператор where, содержащий вложенное табличное выражение, которое включает оператор from, ссылающийся на ту же таблицу, что и оператор from, описанный в пункте 4.
7. Выражение выборки не содержит инструкции group by.
8. Выражение выборки не содержит инструкции having.
Замечание 1. Обновляемость в стандарте SQL реализована по принципу "все или ничего". Это значит, что все три операции, insert, update и delete, либо можно применять на представлении, либо все три операции применять на представлении нельзя. Например, в контексте стандарта SQL невозможна ситуация, когда на представлении можно применять операцию delete и нельзя применять операцию insert (хотя некоторые коммерческие программные продукты обладают такой возможностью).
Замечание 2. В стандарте SQL операция update либо применима к данному представлению, либо нет. В контексте стандарта SQL недопустима ситуация, когда одни столбцы представления являются обновляемыми, а другие — нет (хотя некоторые коммерческие программные продукты пошли дальше стандарта в этом отношении).
И, наконец, из изложенного материала следует, что целевым отношением в стандарте SQL может быть только именованное отношение (таблица базы данных или представление), а не более общее выражение.