Главная страница


su.dbms

 
 - SU.DBMS ----------------------------------------------------------------------
 From : ЏгвЁ«Ё­ …ўЈҐ­Ё© ‚ «Ґ­вЁ­®ўЁз         2:5020/400     12 Mar 2003  13:14:44
 To : All
 Subject : Пример, как хранить нескольки версий объекта
 -------------------------------------------------------------------------------- 
 
 Hi All,
 
 Был вопрос как хранить несколько версий объекта, 
 я написал пример который это демонстрирует. Он для FireBird 1.5.
 И пользуеться некоторыми специфическими возможностями FB, такими как
 Тригерры для VIEW. Он очень хорошо показывает как можно организовать
 Структуру СУБД для хранения версий. Причем это вложенно в саму структуру
 И пользователь работает с view "Item" как с обычной таблицей. 
 А версии порождаються сами. При надобности доступа к версии, запись 
 достаеться из "Item_H". В этом примере показываеться, нечто абстрактное. 
 Можно например добавить чтобы в рамках одной транзакции изминение не 
 порождало новую версию.
 create table "Item_ID" /*Вспомогательная таблица хранит номер последней
 версии*/
 (
  ID integer not null primary key,
  MaxOld integer not null 
 );
 create table "Item_H" /*Таблица хранит все версии объекта*/
 (
  ID integer not null,
  HowOld integer not null,
  article varchar(20),
  name varchar(80),
  price numeric(18,4),
  primary key(ID,HowOld),
  foreign key (id) references Item_ID on update cascade on delete cascade
 );
 create view "Item" (ID,article,name,price)
 /*view с последней записью объекта, основное для использования */
 as
 select a.id,article,name,price from
 "Item_ID" a,"Item_H" b
 where a.id=b.id and a.MaxOld=b.HowOld;
 create trigger "Item_I" for "Item" before insert
 as
 begin
 insert into "Item_ID"(id,maxold) values(new.id,0);
 insert into "Item_H"
 (ID,howold,article,name,price)values(new.ID,0,new.article,new.name,new.price);
 end;
 create trigger "Item_U" for "Item" before update
 as
 declare variable i integer;
 begin
 update "Item_ID" set maxold=maxold+1 where id=new.id;
 select maxold from "Item_ID" where id=new.id into i;
 insert into "Item_H"
 (ID,howold,article,name,price)values(new.ID,:i,new.article,new.name,new.price);
 
 end;
 create trigger "Item_D" for "Item" after delete
 as
 declare variable i integer;
 begin
 delete from  "Item_ID" where id=old.id;
 end;
 
 С уважением Путилин Евгений Валентинович
 
 --- ifmail v.2.15dev5
  * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Пример, как хранить нескольки версий объекта   ЏгвЁ«Ё­ …ўЈҐ­Ё© ‚ «Ґ­вЁ­®ўЁз   12 Mar 2003 13:14:44 
Архивное /su.dbms/16679ec048070.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional