Главная » SQL, Базы данных » ПОДДЕРЖКА ПРЕДСТАВЛЕНИЙ В ЯЗЫКЕ SQL

0

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

CREATE VIEW <view name> AS <table exp>

[ WITH [ <quali£ier> ] CHECK OPTION ] ;

Пояснения

3.  Значение параметра <table   exp> представляет собой определение представ ления.

4.  Конструкция WITH   CHECK   OPTION, если она указана, означает, что операции вставки (INSERT) и обновления (UPDATE) для данного представлении будут отме нены в случае нарушения ограничений целостности, указанных в определении представления. Поэтому необходимо учитывать, что подобные операции будут окан чиваться неудачей лишь в том случае, когда конструкция WITH CHECK OPTION за дана явно, т.е. по умолчанию любые операции вставки и обновления кортежей бу дут завершаться успешно. На основании выводов, сделанных в разделе 10.4, можно заключить, что такой способ организации работы логически не оправдан. Поэтому настоятельно рекомендуется на практике всегда указывать опцию WITH   CHECK OPTION в определениях любых создаваемых представлений7 [10.5].

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

Примеры

1.         CREATE VIEW GOOD_SUPPLIER

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

WHERE S.STATUS > 15

WITH CHECK OPTION ;

2.         CREATE VIEW REDPART

AS SELECT P.P#, P.NAME, P.WEIGHT AS WT, P.CITY FROM  P

WHERE P.COLOR = ‘Red’ WITH CHECK OPTION

;

3 . CREATE VIEW PQ

AS SELECT P.P#, ( SELECT SUM ( SP.QTY ) FROM   SP

WHERE SP.P# = P.P# ) AS TOTQTY FROM P ;

В языке SQL это представление не рассматривается как обновляемое, поэтому конструкция WITH CHECK OPTION должна быть опущена.

4.  CREATE VIEW CITY_PAIR

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# ;

В языке SQL это представление также не рассматривается как обновляемое, поэтому конструкция WITH CHECK OPTION должна быть опущена.

5.  CREATE VIEW HEAVY_REDPART

AS SELECT RP.P#, RP.PNAME, RP.WT, RP.CITY FROM REDPART AS RP

WHERE RP.WT > 12.0

WITH CHECK OPTION ;

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

синтаксис которого приведен ниже.

DROP VIEW <view name> <behavior> ;

В этом операторе (как обычно) параметр <behavior>, который указывает  способ удаления,  может  принимать  значения  RESTRICT  И  CASCADE.  ЕСЛИ   задана  опция RESTRICT, а удаляемое представление где-то используется  (например, в определениях других представлений или в ограничениях целостности), то данная операция DROP окончится неудачей. Если же указана опция CASCADE, то выполнение данной операции DROP завершится успешно и  повлечет за собой неявное применение операторов DROP … CASCADE ко всем компонентам базы данных, в которых в настоящее время используется данное представление.

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

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

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

В языке SQL поддержка средств обновления представлений остается ограниченной. Причину такого положения дел чрезвычайно трудно обосновать какими-то разумными доводами!  Фактически,  в  этой  области  стандарт  языка   SQL  остается  еще  более "непробиваемым", чем обычно8. Ниже приведена типичная выдержка из этого стандарта (лишь немного отредактированная для согласования с текущим контекстом).

Выражение запроса <query expression^ QE1, является обновляемым  тогда и только тогда, когда каждое выражение запроса <query expression> или каждая спецификация запроса «juery specification^ QE2, которая просто содержится в QE1, соответствует указанным ниже требованиям.

а)  QE1 включает QE2 без промежуточных выражений, отличных от запросов на соединение, <поп   join   query   expression>, которые определяют собой КОНСТРУКЦИИ9 UNION DISTINCT, EXCEPT  ALL ИЛИ EXCEPT

DISTINCT.

б)  Если QE1 просто содержит выражение, отличное от запроса на соединение (Non Join Query Expression — NJQE), который определяет конструкцию UNION ALL, то имеет место следующее:

■     выражение NJQE непосредственно содержит выражение запроса <query   ехpression>, LO, и терм запроса <guery term>, RO, такие что ни одна таблица

L0, в целом лежащая в основе лист-отношения, не является также таблицей R0, в

целом лежащей в основе лист-отношения;

■     для каждого столбца в выражении NJQE основополагающие столбцы в табли цах, обозначенных, соответственно, как L0 и RO, являются одновременно либо обновляемыми, либо не обновляемыми.

в)  QE1 включает QE2 без промежуточных выражений, отличных от запросов на соеди нение, <поп join  query expression>, которые определяют собой конструк цию INTERSECT.

г)   QE2 является обновляемым.

Обратите внимание: во-первых, приведенное выше правило представляет собой только одно из многих правил, которые должны рассматриваться в их сочетании при определении того, является ли обновляемым данное представление, во-вторых, все рассматриваемые правила не приведены в одном месте, а  разбросаны по многим разным частям документа, и, в третьих, во всех этих  правилах упоминается множество разнообразных дополнительных концепций и  конструкций, таких как обновляемый столбец (updatable column), таблица, в целом лежащая в основе лист-отношения (leaf generally underlying table), выражение, отличное от запросов на соединение (non join query term), которые, в свою очередь, определены совсем в других частях документа.

8   Цитата из [10.11]: "Стандарт SQL был и продолжает оставаться барьером на пути к разработке (не говоря уже об осуществлении) общих методов обновления представлений".

9   Мы не упоминали об этом в главе 8, но в стандарте SQL: 1999 дополнительно предусмотрена воз можность явно задавать спецификатор DISTINCT вместо ALL в сочетании с ключевыми словами UNION, INTERSECT и EXCEPT. Аналогичным образом, может быть также явно задан спецификатор ALL вместо DISTINCT в сочетании с ключевым словом SELECT. Но необходимо учитывать, что по умолчанию с ключевыми словами UNION, INTERSECT И EXCEPT применяется DISTINCT, с ключевым СЛОВОМ SELECT по умолчанию применяется ALL.

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

1.           Представления, которые определены как сокращение и/или проекция одной базо вой таблицы.

2.           Представления, определенные как соединение "один ко одному" или "один ко многим" двух базовых таблиц10 (в случае соединения "один ко многим" обновляе мой является только сторона "многие").

3.           Представления, определенные выражениями UNION ALL или INTERSECT с двумя отдельными базовыми таблицами.

4.           Некоторые комбинации вариантов, которые относятся к описанным выше случаям 1 —3.

Мало того, даже эти ограниченные варианты трактуются неправильно из-за того, что в языке SQL недостаточно широко используется такое понятие, как предикат, и особенно в связи с тем фактом, что в языке SQL разрешаются дубликаты строк. И вся эта картина усложняется еще больше ввиду того, что в языке SQL распознаются четыре отдельных случая, когда данное представление может быть обновляемым, потенциально обновляемым, просто обновляемым или применимым для вставки11 (где понятие обновляемый относится к операторам UPDATE и DELETE, а понятие применимый для вставки — к операторам INSERT,  и  представление не может быть применимым для вставки, если оно не является  обновляемым). Но что касается описанного выше случая 1, то необходимо сформулировать соответствующие требования немного точнее. А именно, представление SQL безусловно является обновляемым, если удовлетворяются все перечисленные ниже восемь условий.

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

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

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

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

1    В стандарте SQL эти термины определены формально, но не дано никакого намека на то, каково их интуитивное значение и почему они были выбраны. Обратите внимание на нарушение в этом прин ципов 9 и 10, которые были описаны в подразделе "Направления создания механизма обновления пред ставлений" раздела 10.4.

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

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

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

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

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

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

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

10.6.  РЕЗЮМЕ

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

Также была затронута проблема представлений и логической независимости от данных. Существует два аспекта такой независимости: аспект роста и аспект реструктуризации. Среди других преимуществ представлений можно отметить  их способность скрывать данные и, следовательно, обеспечивать определенный уровень защиты, а также их способность выступать в роли сокращенной записи и тем самым упрощать работу пользователей. Были рассмотрены два важных  принципа — принцип взаимозаменяемости (из

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

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

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии