Шрифт:
* он требует, чтобы обязательно присутствовал список столбцов;
* он делает запрос неизменяемым.
Предположим, что вы хотите создать просмотр, который выводит гипотетическое увеличение на 10 процентов окладов всех служащих компании. Следующий пример создает просмотр только для чтения, который отображает всех служащих и их возможные новые оклады:
CREATE VIEW RAISE_BY_10
(EMPLOYEE, NEW_SALARY)
AS
SELECT EMP_NO, SALARY * 1.1 FROM EMPLOYEE;
WITH CHECK OPTION является необязательным синтаксическим элементом, используемым только в спецификациях просмотров. Он воздействует на изменяемые просмотры, которые были определены с предложением WHERE. Это воздействие осуществляется на блок любых изменяющих операций, результатом которых может быть нарушение условия поиска в предложении WHERE.
Предположим, вы создаете просмотр, который предоставляет доступ ко всем отделам с бюджетами от $10 000 до $500 000. Просмотр V_SUB_DEPT может быть определен следующим образом:
CREATE VIEW V_SUB_DEPT (
DEPT_NAME,
DEPT_NO,
SUB_DEPT_NO,
LCW_BUDGET)
AS SELECT
DEPARTMENT,
DEPT_NO,
HEAD_DEPT,
BUDGET
FROM DEPARTMENT
WHERE BUDGET BETWEEN 10000 AND 500000
WITH CHECK OPTION;
Пользователь с привилегиями INSERT К этому просмотру может добавлять новые данные в столбцы DEPARTMENT, DEPT_NO, HEAD_DEPT и BUDGET базовой таблицы через этот просмотр, WITH CHECK OPTION гарантирует, что все значения бюджетов, вводимые через этот просмотр, будут находиться в указанном для просмотра диапазоне.
Следующий оператор добавляет новую строку отдела Publications через просмотр
V_SUB_DEPT:
INSERT INTO V_SUB_DEPT (
DEPT_NAME,
DEPT_NO,
SUB_DEPT_NO,
LOW_BUDGET)
VALUES ('Publications', '999', '670', 250000);
Однако следующий оператор не будет выполнен, потому что значение LOW_BUDGET выходит за пределы диапазона, заданного для базового столбца BUDGET:
INSERT INTO V_SUB_DEPT (
DEPT_NAME,
DEPT_NO,
SUB_DEPT_NO,
LOW_BUDGET)
VALUES ('Publications', '999', '670', 750000);
ISC ERROR CODE:335544558
Operation violates CHECK constraint on view or table V_SUB_DEPT
(ISC ERROR CODE:335544558
Операция нарушает ограничение CHECK для просмотра или таблицы V_SUB_DEPT)
Предложение WITH CHECK OPTION В просмотре может быть полезным, когда вы хотите предоставить пользователям изменяемый просмотр, однако вам нужно не допустить изменения ими некоторых столбцов. Просто включите условие поиска для каждого столбца, который вы хотите защитить. Полезность этого предложения несколько ограничена по той причине, что просмотр не может быть определен с заменяемыми параметрами.
Просмотры только для чтения и изменяемые
Когда над просмотром выполняется операция DML, изменения могут быть переданы базовым таблицам, на основе которых был создан просмотр, только в случае выполнения некоторых условий. Если просмотр соответствует этим условиям, он будет изменяемым. Если он не соответствует этим условиям, то просмотр будет только для чтения, и изменения в просмотре не смогут передаваться базовым таблицам.
Через просмотр значения могут передаваться только тем столбцам, которые были поименованы в просмотре. Firebird сохраняет NULL во всех других столбцах. Просмотр не будет изменяемым, если в нем не указаны столбцы, которые не допускают значения NULL.
Просмотр только для чтения может быть сделан изменяемым с помощью триггеров.
Просмотры только для чтения
Просмотр будет просмотром только для чтения, если его оператор SELECT имеет любую из следующих характеристик:
* указывает квантификатор строк, отличный от ALL (т. е. DISTINCT, FIRST, SKIP);
* содержит поля, определенные через подзапросы или другие выражения;
* содержит поля, определенные через агрегатные функции, и/или содержит предложение GROUP BY;
* включает спецификации UNION;
* соединяет несколько таблиц;
* включает не все столбцы NOT NULL из базовой таблицы;
* выбирает данные из существующего просмотра, который не является изменяемым.
Вы можете написать триггеры, которые будут выполнять корректные изменения в базовых таблицах, когда для просмотра запрашиваются операции DELETE, UPDATE или INSERT. Такая возможность Firebird может перевести неизменяемые просмотры в изменяемые.