Для наиболее простых представлений допустимо выполнение 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, просмотров: 274.