Изменение данных представлений.

Гарантируется, что представления, построенные с помощью 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.