Гарантируется, что представления, построенные с помощью SQL-запросов к одной основной таблице и без использования группировки, можно изменять, подобно основной таблице. Это легко объяснимо — такие представления просто являются частью основной таблицы и изменения, вносимые в эти представления, легко преобразуются в изменения основной таблицы.
Пример 59 Например, представление analisys (пример 50) обязательно является обновляемым. Можно, например, выполнить оператор удаления данных:
delete from analysis where stud_nomer = '010001' или оператор изменения:
update analysis set dat = '07.01.2004'
Первый из этих операторов просто удалит, из основной таблицы ball строки, удовлетворяющие указанному условию, а второй — изменит поле dat на '07.01.2004' во всех строках таблицы ball, которые попали в представление analysis.
Более сложная ситуация с оператором insert. Для его использования могут возникнуть два препятствия. Первое из них: представление содержит не все столбцы исходной таблицы. В частности, наше представление analysis содержит 3 из о столбцов таблицы ball. Поэтому, если попытаться выполнить оператор вставки
insert into analysis(stud_nomer, dat, res) values ('011101', '04.01.2004', 60)
то возникнут проблемы с заполнением полей dis и form таблицы ball. Ситуация разрешается с помощью записи в такие поля значения по умолчанию или NULL, если значения по умолчанию не определены. В нашем случае для form будет использоваться значение по умолчанию ('Экзамен'), а для dis — NULL. Но так как поле dis не допускает значений NULL, то этот оператор вставки приведет к ошибке и не будет выполнен.
Другой подводный камень добавления строк в представлении — появление строк, не удовлетворяющих условиям представления.
Пример 60 Предположим, что представление analysis определено так:
create view analysis as select stud_nomer, dis, dat, res from ball where dis = 'Анализ'
Если теперь в это представления вставить строку, для которой поле dis будет иметь значение 'Алгебра':
insert into analysis(stud_nomer, dis, dat, res) values('011101', 'Алгебра', '15.01.2004', 6°)
то формально никакой ошибки не будет, эта строка вставиться в таблицу ball. Но при повторном выборе данных из представления analysis эта строка не появится, так как не удовлетворяет, условию представления. Получается ситуация, когда мы вроде бы вставляем данные, но не видим их. То же самое может случиться при использовании оператора update: можно изменить данные таким образом, что они перестанут удовлетворять условию представления и окажутся как бы удаленными из него.
Если нужно избежать таких проблем, представление создается с параметром with check option:
create view as... with check option
Представления, созданные таким образом, не допускают вставку данных, не удовлетворяющих условию представления.
Пример 61 Например,
create view analysis as select stud_nomer, dis, dat, res from ball where dis = 'Анализ' with check option
To есть, оператор insert из примера 60 для последнего представления вызовет ошибку и не вставит новой строки. Точно так же через представление analysis нельзя произвести изменение существующих строк, в результате которого строки перестанут, удовлетворять условиям представления. Например, оператор
update analysis set dis = 'Алгебра'
вызовет ошибку.
Задача 100 (Библиотека) Создайте представление, которое позволяет, изменять информацию о выдаче книг только для тех читателей, адрес которых содержит в качестве подстроки «Садовый пер.».
Задача 101 (Банк) Создайте представление, которое позволяет изменять информацию о счетах только тех клиентов, имя которых начинается на буквы от, «И» до «О».
Задача 102 (Университет) Создайте представление, которое позволяет изменять информацию об оценках только тех студентов, которые учатся в группах с номером от 10 до 19.