|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /su.dbms/16679ec048070.html, оценка из 5, голосов 10
|