Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
50
Добавлен:
10.02.2015
Размер:
171.78 Кб
Скачать

Использование конструкции with check option

В представление помещаются только те строки, которые удовлетворяют условию WHERE в определяющем запросе. Если строка в представлении будет изменена таким образом, что перестанет удовлетворять этому условию, то эта строка должна исчезнуть из данного представления. Аналогичным образом, в представлении будут появляться новые строки всякий раз, когда вставка или обновление данных в представлении приведет к тому, что новые строки будут удовлетворять условию WHERE. Строки, которые добавляются или исключаются из представления в зависимости от содержащихся в них данных, принято называть мигрирующими.

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

Такая функция может оказаться настолько полезной, что работать с представлениями окажется удобнее, чем с таблицами базы данных. В том случае, когда оператор INSERT или UPDATE нарушает условия, указанные в конструкции WHERE определяющего запроса, выполнение затребованной операции отменяется. В результате появляется возможность реализовать в базе данных дополнительные ограничения, направленные на сохранение целостности данных. Следует отметить, что конструкцию WITH CHECK OPTION можно указывать только для обновляемых представлений, определение которых дано в предыдущем разделе.

Пример

Пример:Использование опции WITH CHECK OPTION

Еще раз обратимся к представлению, созданному в примере "Создание горизонтального представления":

CREATE VIEW Manager3Staff

AS SELECT *

FROM Staff

WHERE branchNo = 'B003'

WITH CHECK OPTION;

Теперь попытаемся изменить значение номера отделения в любой из строк с 'В003' на 'B005' , например, с помощью следующего оператора:

UPDATE Manager3Staff

SET branchNo = 'BOO5'

WHERE staffNo = 'SG37';

Поскольку в определении представления была указана конструкция WITH CHECK OPTION, выполнение этого оператора будет заблокировано, так как в противном случае произойдет миграция строки из данного горизонтального представления. Таким образом, не будет иметь успеха и попытка выполнения следующего оператора:

INSERT INTO Manager3Staff

VALUES('SL15', 'Mary', 'Black', 'Assistant', 'F' ,

DATE '1967-06-21', 8000, 'B002');

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

А теперь рассмотрим ситуацию, когда представление МападегЗ Staff создается не на базе самой таблицы Staff, а на базе другого представления, созданного для этой таблицы.

CREATE VIEW LowSalary

AS SELECT *

FROM Staff

WHERE salary > 9000;

CREATE VIEW HighSalary

AS SELECT *

FROM LowSalary

WHERE salary > 10000

WITH LOCAL CHECK OPTION;

CREATE VIEW Manager3Staff

AS SELECT *

FROM HighSalary

WHERE branchNo = 'B0031';

Теперь попытаемся выполнить в представлении Manager3Staff следующий оператор:

UPDATE Manager3Staff

SET salary = 9500

WHERE staffNo = 'SG37';

Однако это нам не удастся. Дело в том, что после выполнения данного оператора измененная строка исчезнет только из представления HighSalary, но сохранится в представлении LowSalary, на базе которого сформировано представление HighSalary. Если же при обновлении установить новое значение заработной платы равным 8 000 фунтов стерлингов, то эта операция будет успешной, поскольку измененная строка должна будет исчезнуть и из представления LowSalary. Если же при определении представления HighSalary указать конструкцию WITH CASCADED CHECK OPTION, то при указании любого из упомянутых значений заработной платы (как 9 500, так и 8 000 фунтов стерлингов в год) выполнение данного обновления будет заблокировано, поскольку измененная строка должна будет исчезнуть из представления HighSalary. Следовательно, для того чтобы получить гарантию, что подобные аномалии обновления никогда не будут иметь места, каждое из создаваемых представлений должно содержать конструкцию WITH CASCADED CHECK OPTION.

Соседние файлы в папке Bazy_dannykh_1_kurs_2_semestr_2011-2012