Обновление представлений
На некоторые представления можно писать запросы Update, Delete и Insert, как на обычные таблицы. При выполнении таких запросов реально все изменения вносятся в физические таблицы.
Такие представления называются обновляемыми. Согласно стандарту SQL, обновляемыми являются представления, основанные на запросах:
- только по одной таблице
- запрос не должен содержать ключевых слов DISTINCT, GROUP BY, HAVING
- не должен содержать вложенных запросов
- не должен быть комбинированным, т.е. недолжен содержать операций UNION, INTERSECT, EXCEPT (MINUS).
Oracle, дополнительно, не позволяет обновлять запросы с сортировкой результатов.
Таким образом, обновляемых представлений не так и много:
· представления с отбором столбцов (вертикальные представления)
· представления с отбором строк (горизонтальные представления)
· представления с отбором строк и столбцов (смешанные представления).
Например, создадим горизонтальное представление на основе выборки из таблицы оценок marks, содержащее только оценки по Математике.
Предварительно мы выяснили из таблицы предметов subjects, что математика имеет код 1.
Тогда для создания представления потребуется выполнить команду:
Create VIEW mark_1
as
select * FROM marks
WHERE cod_sub=1
Это представление будет обновляемым, поэтому преподаватель математики, которому разрешено обновление этого представления, может изменить любую (одну) оценку, например, таким запросом:
UPDATE mark_1 SET mark=5 WHERE cod_st=123
Однако, запрос:
UPDATE mark_1 SET cod_sub=2 WHERE cod_st=123
который также, как и первый, является разрешенным, приведет к неожиданным последствиям. Обновленная строка окажется за пределами представления mark_1 и запрос:
SELECT * FROM mark_1
эту строку не покажет.
Если такой побочный эффект нежелателен, в команду CREATE VIEW … следует добавить дополнительную фразу WITH CHECK OPTION:
DROP VIEW mark_1
Create VIEW mark_1
as
select * FROM marks WHERE cod_sub=1
WITH CHECK OPTION
Теперь при любой попытке изменить код предмета или добавить предмет с кодом, отличным от единицы, будет выдано сообщение об ошибке.
Если говорить о данном конкретном примере, то можно было бы поступить еще проще: не включать столбец cod_sub в представление, тогда у преподавателя математики просто не будет никакой возможности изменить (нечаянно или преднамеренно) код своего предмета.
Дата добавления: 2015-08-26; просмотров: 615;