Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
114
Добавлен:
16.03.2016
Размер:
5.67 Mб
Скачать

21.3.3. Раздел with check option определения представления

Пусть в базе данных имеется упрощенная таблица EMP, содержащая следующее множество строк (как в примере сGROUP BY ROLLUPразделе20.2. Возможности формулирования аналитических запросовлекции 20):

158 Напомним из лекции 17, что в соответствии с семантикой оператора выборки в результат раздела WHERE входят все строки результата раздела FROM, для которых результатом вычисления логического условия раздела WHERE является true.

159 Напомним из лекции 17, что на вход раздела HAVING подается результат раздела GROUP BY, если этот раздел присутствует в спецификации запроса, иначе – результат раздела WHERE, если этот раздел присутствует в спецификации запроса, иначе – результат раздела FROM.

EMP

EMP_NO

DEPT_NO

EMP_BDATE

EMP_SAL

2440

1

1950

15000.00

2441

1

1950

16000.00

2442

1

1960

14000.00

2443

1

1960

19000.00

2444

2

1950

17000.00

2445

2

1950

16000.00

2446

2

1960

14000.00

2447

2

1960

20000.00

2448

3

1950

18000.00

2449

3

1950

13000.00

2450

3

1960

21000.00

2451

3

1960

22000.00

Предположим, что в базе данных имеется представление RICH_EMP, определенное следующим образом:

CREATE VIEW RICH_EMP AS

SELECT *

FROM EMP

WHERE EMP_SAL > 18000.00;

Понятно, что в соответствии с правилами SQL (и здравым смыслом) над этим представлением можно выполнять операции обновления. Как видно, в таблице EMPсодержится строка, которая соответствует служащему с номером2447, получающему зарплату в размере20000руб. Естественно, эта строка будет присутствовать в виртуальной таблицеRICH_EMP. Поэтому можно было бы выполнить, например, операцию

UPDATE RICH_EMP

SET EMP_SAL = EMP_SAL – 3000

WHERE EMP_NO = 4452;

Но если выполнение такой операции действительно допускается, то в результате строка, соответствующая служащему с номером 2447, исчезнет из виртуальной таблицыRICH_EMP! Аналогичный эффект возникнет при выполнении операции вставки

INSERT INTO RICH_EMP (EMP_NO) 2452;

В базовой таблице EMPпоявится строка, в которой значением столбцаEMP_NOбудет2452, а значения остальных столбцов будут установлены по умолчанию. В частности, значением столбцаEMP_SALбудет10000.00. Тем самым, если подобная операция вставки действительно допустима, то мы вставили в виртуальную таблицуRICH_EMPстроку, которую в этой виртуальной таблице увидеть невозможно.

Чтобы избежать такого противоречивого поведения представляемых таблиц, нужно включать в определение представления раздел WITH CHECK OPTION. При наличии этого раздела до реального выполнения операций модификации или вставки строк через представление для каждой строки будет проверяться, что она соответствует условиям представления. Если данное условие не выполняется хотя бы для одной модифицируемой или вставляемой строки, то операция полностью отвергается. В некотором смысле (при наличии разделаWITH CHECK OPTION) условие выборки, содержащееся в выражении запросов представления, можно считать ограничением целостности этого представления.