Московский государственный университет имени М.В.Ломоносова
Опубликован: 05.01.2004 | Доступ: свободный | Студентов: 9474 / 1246 | Оценка: 4.04 / 3.84 | Длительность: 10:03:00
ISBN: 978-5-94774-539-9
Лекция 6:

Работа с представлениями. Типы данных

< Лекция 5 || Лекция 6: 123 || Лекция 7 >

Изменение данных в представлениях

Если для представления указывается оператор 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.

< Лекция 5 || Лекция 6: 123 || Лекция 7 >