Работа с представлениями. Типы данных
Изменение данных в представлениях
Если для представления указывается оператор DELETE, INSERT или UPDATE, то все изменения происходят как над представлением, так и над основными таблицами, используемыми для создания представления. Не во все представления можно внести изменения. Так, представления могут быть изменяемыми или постоянными.
Стандарт позволяет внесение изменений всегда только в одну основную таблицу. Однако большинство коммерческих СУБД позволяют вносить изменения и в две связанные между собой таблицы, но с некоторыми оговорками.
Стандарт SQL-92 определяет, что представление является изменяемым, если выполнены следующие условия:
- запрос, используемый для создания представления, извлекает данные только из одной таблицы;
- если в запросе, используемом для создания таблицы, в качестве таблицы выступает представление, то оно также должно быть изменяемым;
- не разрешается никаких объединений таблиц, даже самой с собой;
- запрос, используемый для создания представления, не должен содержать вычислимых столбцов, агрегирующих функций и фраз DISTINCT, GROUP BY и HAVING ;
- в запросе, используемом для создания представления, нельзя ссылаться дважды на один и тот же столбец.
Опции [WITH [CASCADED | LOCAL] CHECK OPTION
Для изменяемого представления можно указывать фразу WITH CHECK OPTION, позволяющую предотвращать "потерю строк" в представлениях. Так, если эта фраза указана, то при внесении изменений в таблицу будет проверен предикат, указанный в запросе, использованном для создания таблицы. Если предикат не возвращает значение TRUE, то изменения не будут внесены.
Например, если запрос создан оператором
CREATE VIEW v_tbl1 AS (SELECT f1,f2, f3 FROM tbl1 WHERE f2>100) WITH CHECK OPTION;,
то вставка строки не будет произведена:
INSERT INTO v_tbl1 (f1,f2,f3) VALUES (1,50,'abc');
Фраза WITH CHECK OPTION может быть расширена до:
- WITH CASCADED CHECK OPTION - предикаты проверяются во всех вложенных запросах;
- WITH LOCAL CHECK OPTION - предикаты проверяются только в запросе, использованном для создания данного представления;
Так, для представления, созданного операторами
CREATE VIEW v_1 AS (SELECT f1,f2, f3 FROM tbl1 WHERE f2>100);, CREATE VIEW v_2 AS (SELECT f1,f2, f3 FROM v_1 WHERE f2>50) WITH LOCAL CHECK OPTION;,
добавление строки будет выполнено:
INSERT INTO v_2 (f1,f2,f3) VALUES (1,30,'abc');.
Эта строка будет добавлена в основную таблицу, но не будет видна в представлении, посредством которого она была добавлена.
По умолчанию предполагается, что для WITH CHECK OPTION используется фраза CASCADED.