DML-операции с представлениями
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

Для наиболее простых представлений допустимо выполнение DML-операций INSERT, DELETE и UPDATE. Следует помнить, что любая операция добавления, удаления или изменения строк представления все равно транслируется в соответствующую операцию с базовой таблицей. Как следствие этого, все существующие ограничения целостности базовой таблицы наследуются представлением.

При создании представлений, позволяющих выполнять операции INSERT, DELETE и UPDATE, базовый SELECT-запрос должен удовлетворять следующим условиям:

1) не содержать секцию группировки GROUP BY;

2) не применять агрегатные функции;

3) не использовать опции DISTINCT и TOP;

4) не применять операторы UNION, INTERSECT и EXCEPT;

5) в SELECT-списке запроса не должно быть вычисляемых значений.

6) в секции FROM запроса должна указываться только одна таблица.

Для демонстрации применения операторов INSERT, DELETE, UPDATE на основе запросов к таблицам AUDITORIUM_ TYPE и AUDITORIUM создадим два представления (рис. 12.10) с именами vAT и vAU. Заметим, что представления удовлетворяют перечисленным выше требованиям. Обратим внимание также, что в обоих случаях в базовых SELECT-запросах применяются секции WHERE для фильтрации строк.

 

Рис. 12.10. Создание представлений vAT и vAU

Рис. 12.11. Сообщения об ошибках при добавлении строк в представление vAT

 

В сценарии на рис. 12.11 демонстрируется выполнение трех операторов INSERT, добавляющих строки в представление vAT. Выполнение первых двух операторов завершается с ошибками. Ошибки возникают в силу нарушения ограничения целостности PRIMARY KEY в базовой для представления таблице AUDITORIUM_ TYPE. Причем возникает несогласованность: отобразить с помощью оператора SELECT строку со значением ЛБ-Х в столбце AT невозможно (рис. 12.12), но причиной ошибки (рис. 12.11) она является. Более того, удалить ее тоже невозможно (рис. 12.13).

Рис. 12.12. Строка представления со значением ЛБ-Х в столбце AT

 

Рис. 12.13. Удаление «невидимой» строки в представлении,
 не приводящее к результату

 

Кроме того, в представление можно добавить строку, которую не «учтет» функция COUNT (рис. 12.14) и не отобразит оператор SELECT.

 

Рис. 12.14. Успешно добавленная строка, которая может стать «невидимой»

 

Оператор UPDATE может привести к эффекту удаления строки (рис. 12.15).

 

Рис. 12.15. Эффект удаления строк в результате применения
оператора UPDATE к представлению

 

Такое несогласованное поведение DML-операторов может привести к ошибкам при написании запросов. Для того чтобы предотвратить несогласованность, при создании или изменении представления может быть указана специальная опция CHECK OPTION. В представлении с этой опцией помимо унаследованных от базовой таблицы ограничений целостности появляется еще одно ограничение, основанное на логическом выражении в секции WHERE базового SELECT-оператора.

В сценарии, представленном на рис. 12.16, с помощью оператора ALTER изменяются два представления: vAT и vAU. Заметьте, в обоих случаях применяется предложение WITH CHECK OPTION.

 

Рис. 12.16. Опция CHECK OPTION, указанная в операторе ALTER
 для представлений vAT и vAU

 

Сценарий на рис. 12.17 демонстрирует выполнение операторов INSERT и UPDATE для представлений vAT и vAU после выполнения операторов ALTER в сценарии на рис. 12.16. Заметим, что если бы опция CHECK OPTION не была установлена, то второй оператор INSERT и оператор UPDATE выполнились бы успешно.

 

Рис. 12.17. Опция CHECK OPTION, добавляющая представлению
 дополнительное ограничение

 

Обратите внимание на следующее.

1. В первом операторе INSERT ограничение целостности PRIMARY KEY, унаследованное представлением vAT, «сработало» раньше ограничения, обусловленного опцией CHECK OPTION.

2. Добавление в представление строк данных, не удовлетворяющих логическому WHERE-выражению базового SELECT-запроса, невозможно.

3. Изменить существующие строки представления с помощью оператора UPDATE таким образом, чтобы после изменения строки не удовлетворяли логическому WHERE-выражению в базовом SELECT-запросе, невозможно.

 





Дата: 2019-02-25, просмотров: 231.