Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Еще раз о генераторах :) [IB6.x, Firebird]


kaif ©   (2006-09-28 14:03:00) 

Вот придумал, как мне кажется, полезную вещь в триггере.

Если значение поля ID пусто, то щелкает генератор (как в классике).

Если непусто и меньше текущего значения генератора, то вставляется как есть, а если больше текущего значения генератора, то генератор сдвигается на это новое значение.

Может быть удобно при импорте данных (в моем случае это удобно).

Соль в том, что команда SET GENERATOR в триггерах не работает. Вместо этого используем функцию GEN_ID, которая может сдвинуть генератор на нужное значение.

CREATE TRIGGER PRODUCT_BEFORE_INSERT FOR PRODUCT
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE DUMMY INTEGER;
BEGIN
 IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(PRODUCT_ID_GEN, 1);
 ELSE IF (NEW.ID > GEN_ID(PRODUCT_ID_GEN, 0)) THEN
   DUMMY = GEN_ID(PRODUCT_ID_GEN, NEW.ID - GEN_ID(PRODUCT_ID_GEN, 0));
END


Готов услышать вашу критику.


Виталий Панасенко   (2006-09-29 16:23:00) [1]


> ANB ©   (28.09.06 14:06) [1]
>
> > kaif ©   (28.09.06 14:03)
>
> Вобщем то так часто делают. Жаль только, сразу после вставки
> ты не сможешь вытащить новое значение ID, т.к. в FB нет
> returning. Придется иногда генерить до вставки, но это твой
> триггер понимает.

В ЖарПтице 2,0 уже есть


Anatoly Podgoretsky   (2006-09-28 19:29:00) [2]


> а если больше текущего значения генератора,

Вот этого быть не должно, никогда.
Не говоря уж о том, что с дерганием генератора получишь проблемы, система то много пользовательская.


ANB   (2006-09-28 16:34:00) [3]


> Вот для таких случаев (особенно когда ID берется из старой
> системы) такой подход может оказаться полезен

А если после справочников нужно заливать данные, которые ссылаются на эти справочники, то этот подход будет только мешать, т.к. тебе понадобится таблица изменения ссылок.


Sergey13   (2006-09-28 15:13:00) [4]

> Речь идет о заливке справочников - в них не так много данных.

Так все равно большого смысла дергать генератор при (в худшем случае) каждой записи я не вижу.
А какое преимущество, по твоему, это дает? Может я не до конца осознал?


kaif   (2006-09-28 15:08:00) [5]

Sergey13 ©   (28.09.06 14:12) [2]
> [0] kaif ©   (28.09.06 14:03)

А не проще при импорте просто залить как есть, а после 1 раз дернуть генератор на max(id)+1?


Обычно я так и делаю.
Поэтому я и сказал иногда.
Речь идет о заливке справочников - в них не так много данных. Но иногда требуется заливка "внахлест". Вот для таких случаев (особенно когда ID берется из старой системы) такой подход может оказаться полезен.


DSKalugin   (2006-09-28 14:45:00) [6]

>Готов услышать вашу критику.
Вот и услышал :-)))))))) Выходит они вообще при импорте не нужны


ANB   (2006-09-28 14:20:00) [7]

Да. кстати. Обычно при импорте триггера вырубают, чтобы побыстрее залить.


DSKalugin   (2006-09-28 14:17:00) [8]

А я делаю это на клиенте 1 раз(!) в конце импорта

SQL.Text:='set generator <имя_генеретора_табл_приемника> to '+IntToStr(TpFIBDatabase.Gen_Id('<имя_генеретора_табл_источника>',0));
ExecQuery;

и оформить в виде процедуры


Sergey13   (2006-09-28 14:12:00) [9]

> [0] kaif ©   (28.09.06 14:03)

А не проще при импортепросто залить как есть, а после 1 раз дернуть генератор на max(id)+1?


ANB   (2006-09-28 14:06:00) [10]


> kaif ©   (28.09.06 14:03)

Вобщем то так часто делают. Жаль только, сразу после вставки ты не сможешь вытащить новое значение ID, т.к. в FB нет returning. Придется иногда генерить до вставки, но это твой триггер понимает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо