Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ИОСУ часть 2 _SQL.doc
Скачиваний:
19
Добавлен:
10.11.2019
Размер:
3.88 Mб
Скачать

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

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

Представления используются по нескольким причинам:

  • позволяют разным пользователям базы данных видеть структуру таблиц по-разному, в более удобном для них виде;

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

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

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

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

Приведем примеры инструкций, создающих различные виды представлений:

Пример

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

create view Minsk AS

select * from staff

where bno in (select bno

from branch

where city=‘Минск’);

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

Пример

Создать представление, показывающее информацию о ФИО и должности служащих.

create view info AS

select fname, lname, position

from staff;

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

Пример

Создать представление, включающее избранную информацию обо всех квартирах сотрудника …

create view property AS

select street, area, type, rent

from property_for_rent

where sno = (select sno from staff

where fname=’…’ and lname=’…’);

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

Пример

Создать представление с информацией о средней заработной плате сотрудников по каждому отделению.

create view average_salary as

select bno, avg(salary)

from staff

group by bno;

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

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

Если определение представления простое, то СУБД формирует каждую строку представления "на лету", извлекая данные из исходных таблиц. Если же определение сложное, СУБД приходится материализовывать представление. Это означает, что СУБД выполняет запрос, определяющий представление, и сохраняет его результаты во временной таблице. Из нее СУБД берет данные для формирования результатов пользовательского запроса, а когда временная таблица становится ненужной, удаляет ее. Но независимо от того, как СУБД выполняет инструкцию, являющуюся определением представления, для пользователя результат будет одним и тем же. Ссылаться: на представление в инструкции SQL можно так же, как если бы оно было реальной таблицей базы данных. Так после определения представления к нему можно обращаться с помощью инструкции SELECT как к обычной таблице:

select * from average_salary;

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

Преимущества использования представлений. В локальных БД на персональных компьютерах представления применяются для удобства и позволяют упрощать запросы. В промышленных базах данных представления играют главную роль в создании собственной структуры базы данных для каждого пользователя и обеспечении ее безопасности. Основные преимущества представлений:

  • Безопасность. Каждому пользователю можно разрешить доступ к небольшому числу представлений, содержащих только ту информацию, которую ему позволено знать (примеры горизонтальных и вертикальных представлений). Таким образом, можно осуществить ограничение доступа пользователей к хранимой информации.

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

  • Простота структуры. С помощью представлений для каждого пользователя можно создать собственную “структуру” базы данных, определив ее как множество доступных пользователю виртуальных таблиц.

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

  • Целостность данных. Если доступ к данным или ввод данных (возможно не для всех представлений) осуществляется с помощью представления, СУБД может автоматически проверять, выполняются ли определенные условия целостности.

Недостатки представлений. Наряду с перечисленными выше преимуществами, представления обладают и двумя существенными недостатками:

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

  • Ограничения на обновление. Когда пользователь пытается обновить строки представления, СУБД должна установить их соответствие строкам исходных таблиц, а также обновить последние. Это возможно только для простых представлений; сложные представления обновлять нельзя, они доступны только для выборки.

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

Обновление представлений. Для простых представлений операции добавления, изменения и удаления можно преобразовать в эквивалентные операции по отношению к исходным таблицам представления. Например, вернемся к представлению Minsk, рассмотренному ранее в примере. Это простое горизонтальное представление, основанное на одной исходной таблице. Добавление строки в данное представление имеет смысл; оно означает, что новая строка должна быть вставлена в таблицу staff, лежащую в основе представления. Аналогично, имеет смысл удаление строки из представления Minsk – это удаление соответствующей строки из таблицы staff. Наконец, обновление строки представления Minsk также имеет смысл: оно будет обновлением соответствующей строки таблицы staff. Во всех случаях требуемое действие можно выполнить по отношению к соответствующей строке исходной таблицы, тем самым, сохраняя целостность исходной таблицы и представления.

Согласно стандарту, представление можно обновлять в том случае, если определяющий его запрос соответствует перечисленным ниже требованиям:

  1. Должен отсутствовать предиката DISTINCT, т.е. повторяющиеся строки не должны исключаться из результата запроса.

  2. В предложении FROM должна быть задана только одна таблица или представление.

  3. Каждое имя в списке возвращаемых столбцов должно быть ссылкой на простой столбец, не должны содержаться выражения, вычисляемые столбцы и статистические функции.

  4. В предложении WHERE не должен содержаться подчиненный запрос

  5. В запросе не должны присутствовать предложения GROUP BY и HAVING.

Обобщая сказанное можно отметить, что если между строками представления и строками исходной таблицы есть соответствие “один – к - одному”, то такое представление можно считать обновляемым. Если между строками представления и исходной таблицы нет однозначного соответствия, то добавление, удаление и изменение строк представления не имеет смысла и поэтому запрещены. Однако некоторые коммерческие СУБД позволяют обновлять “неоднозначные” представления. Так в ORACLE такие обновления возможны посредством триггеров INSTEAD OF .

Контроль над обновлением представлений (предложение WITH CHECK OPTION). Если представление создается посредством запроса с предложением WHERE, то в представлении будут видны только строки, удовлетворяющие условию отбора. Остальные строки в исходной таблице присутствуют, но в представлении их нет. Например, представление Minsk, которое уже рассматривалось ранее в настоящем разделе, содержит только строки таблицы staff с определенными значениями в столбце bno .

Это представление является обновляемым как по стандарту ANSI/ISO, так и в большинстве коммерческих СУБД. В него можно добавить информацию о новом служащем посредством инструкции INSERT:

insert into Minsk (sno, fname, lname, address, position, sex, dob, salary, bno)

values ( ‘s129’, ‘…’, ‘…’, ‘…’, ‘менеджер’, ‘f’, ’01.01.81’, 300, 1).

СУБД добавит новую строку в исходную таблицу staff; она будет видна также в представлении Minsk. Однако если воспользоваться следующей инструкцией для добавления строки в представление Minsk:

insert into Minsk (sno, fname, lname, address, position, sex, dob, salary, bno)

values ( ‘s129’, ‘…’, ‘…’, ‘…’, ‘менеджер’, ‘f’, ’01.01.81’, 300, 2).

и сразу после неё выполнить запрос: select * from Minsk, то только что добавленная строка в ней будет отсутствовать. Тот факт, что в результате выполнения инструкции INSERT или UPDATE из представления исчезают строки, в лучшем случае вызывает замешательство. SQL позволяет организовать своеобразный контроль целостности представлений путем создания их с режимом контроля. Данный режим задается в инструкции CREATE VIEW посредством предложения WITH CHECK OPTION:

create view Minsk as

select * from staff

where bno in (select bno

from branch

where city=‘Минск’)

with check option;

Когда для представления установлен режим контроля, СУБД автоматически проверяет каждую операцию INSERT или UPDATE, выполняемую над представлением, чтобы удостовериться в том, что полученные в результате строки удовлетворяют условиям отбора в определении представления. Если добавляемая или обновляемая строка не удовлетворяет этим условиям, то выполнение инструкции INSERT или UPDATE завершается ошибкой; другими словами, операция не выполняется.

В заключение текущего раздела следует отметить, что удаляются представления посредством инструкции DROP VIEW. Так представление Minsk может быть удалено при выполнении инструкции:

drop view Minsk;