Синтаксис создания обзора
create view <name>[(<list view_col>)] <name> - имя обзора, имя должно быть уникальным в перечне имен обзоров, таблиц и хранимых процедур <list_view_col> ::= <view_col>[,<list_view_col>] <view_col> - имя столбца обзора, имя должно быть уникальным в перечне имен столбцов обзора. Список имен обязателен, если обзор включает столбцы-выражения. Если не указано, используется имена соответствующих столбцов из select. <select> - задает условия выборки данных посредством команды select. Может использоваться полный синтаксис select за исключением конструкции order by. with check option - Предотвращает операции insert или update в обзоре, если они нарушают условие поиска в конструкции where команды select. Типы обзоров Обзоры могут быть обновляемыми (updatable) или только для чтения (read-only). Чтобы обзор был обновляемым, необходимо: • чтобы он представлял собой подмножество одной таблицы или обновляемого обзора; • чтобы все столбцы таблицы, не вошедшие в обзор, допускали значение null; • чтобы команда select, на которой основан обзор, не содержала подзапросов, конструкций distinct, having, агрегатных функций, присоединенных таблиц, пользовательских функций или хранимых процедур. Обзоры только для чтения могут обновляться на основе использования триггеров. В этом случае все действия по обновлению данных в таблицах выполняются триггерами обзора. Для обеспечения возможности обновления данных (команды update и insert) пользователь должен получить соответствующие права, кроме того, для создания обновляемого обзора необходимо, чтобы его создатель имел все права на таблицы, используемые обзором. Для обзора только для чтения достаточно иметь права на select. ПРИМЕР create view rubrics as Обновление данных в обзоре с конструкцией WITH CHECK OPTION Если обзор создан с опцией проверки (with check option), то при попытке обновления или вставки данных проверяется, удовлетворяют ли новые данные условиям выборки, заданным конструкцией where. Данные будут записаны только при выполнении этих условий. Опция with check option применима только для обновляемых обзоров. Значения могут быть вставлены через обзор только для тех столбцов, которые входят в обзор. Для остальных столбцов таблицы устанавливается значения по умолчанию или null. Изменение обзора Нельзя непосредственно изменить обзор. Необходимо сначала выполнить его удаление (drop view), а затем создать его вновь командой create view с требуемыми характеристиками. Удаление обзоров Удаление обзора означает удаление из базы его описания, но не самих данных. Оно разрешено пользователю, создавшему обзор, при выполнении ряда условий, а именно: обзор не используется другим обзором, хранимой процедурой или ограничением целостности (check -конструкцией). drop view <view _name>; 7.2. Триггеры для обзоров (представлений) Создание и изменение триггеров для обзоров в InterBase синтаксически ничем не отличается от триггеров для таблиц, в то же время их функциональность имеет существенные особенности. Триггер для таблицы выполняет некоторый набор действий и если при его работе не возникает исключений, то выполняется соответствующая операция с таблицей: вставка, изменение или удаление записей. В результате действия триггера для обзора никаких автоматических действий не производится. Если необходимо провести те или иные действия с базой, в триггере необходимо предусмотреть соответствующие команды обновления таблиц, в том числе и отказ от обновлений без отката транзакций. В качестве примера рассмотрим обработку таблицы ценника на продукцию с помощью триггера для обзора. Пусть таблица создана командой create table ProdPrice( codeprod integer not null, date_beg date not null, date_end date not null, price numeric (12,2) ); Здесь codeprod – код продукции; date_beg – дата начала действия цены (входит в интервал действия цены); date_end – дата конца действия цены (не входит в интервал действия цены); price – цена продукции. Первичный ключ составляют поля codeprod и date_beg. alter table prodprice add constraint pk_prodprice primary key (codeprod,date_beg) При обращении к подобному ценнику важно непересечение диапазонов действия цен. Обеспечить это средствами триггеров таблиц практически невозможно. Рассмотрим решение этой проблемы с использованием триггера обзора. Обзор может иметь, например, следующий вид. create view vProdPrice(codeprod, date_beg, date_end, price) select codeprod, date_beg, date_end, price from ProdPrice; На первый взгляд подобная конструкция кажется бессмысленной, однако она создает возможность создания соответствующего триггера.
create trigger vprodprice_bi for vprodprice active before insert or update position 0 as declare variable vcodeprod integer; declare variable vdate_beg date; declare variable vdate_end date; declare variable vprice numeric(12, 2); begin if(new.date_beg >= new.date_end) then exit; delete from ProdPrice where codeprod= new.codeprod and date_beg>= new.date_beg and date_end<=new.date_end; -- удаляем все данные внутри нового интервала for select * from ProdPrice where codeprod= new.codeprod and date_beg<=new.date_beg and date_end> new.date_beg into :vcodeprod, :vdate_beg, :vdate_end, :vprice -- находим запись, внутрь интервала дат, в которой попадает -- начало добавляемой -- Из-за удаления внутренних интервалов, таких записей не -- может быть более одной do begin if(vprice=new.price) then -- цены не менялись if(vdate_end>= new.date_end) then exit; -- попали внутрь существующего интервала, цены не менялись, -- ничего не надо делать else begin new.date_beg= vdate_beg; delete from ProdPrice where codeprod= :vcodeprod and date_beg= :vdate_beg; -- переместили начало вставляемой записи, старую удалили end else -- цены менялись update ProdPrice set date_end= new.date_beg where codeprod= :vcodeprod and date_beg= :vdate_beg; -- закрыли период действия цены началом нового интервала end for select * from ProdPrice where codeprod= new.codeprod and date_beg<new.date_end and date_end>= new.date_end into :vcodeprod, :vdate_beg, :vdate_end, :vprice -- находим запись, внутрь интервала дат, в которую попадает начало -- добавляемой. -- Из-за удаления внутренних интервалов, таких записей не -- может быть более одной do begin if(vprice=new.price) then -- цены не менялись begin new.date_end= vdate_end; delete from ProdPrice where codeprod= :vcodeprod and date_beg= :vdate_beg; end else -- цены менялись update ProdPrice set date_beg= new.date_end where codeprod= :vcodeprod and date_beg= :vdate_beg; end insert into ProdPrice(codeprod, date_beg, date_end, price) values(new.codeprod, new.date_beg, new.date_end, new.price); end Созданный триггер контролирует корректность ценника. Отметим, что при массовом обновлении цен значительная их часть остается неизменной и в этом случае триггер вообще не производит обновлений данных, отсутствуют также последовательные интервалы с неизменными ценами. Другим аспектом использования триггеров для обзоров является возможность «растаскивания» данных в несколько таблиц, в том числе и не связанных с теми, на основе которых построен обзор.
Популярное: Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (206)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |