Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

Еще раз о генераторах :)   Найти похожие ветки 

 
kaif ©   (2006-09-28 14:03) [0]

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

Если значение поля 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


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


 
ANB ©   (2006-09-28 14:06) [1]


> kaif ©   (28.09.06 14:03)

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


 
Sergey13 ©   (2006-09-28 14:12) [2]

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

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


 
DSKalugin ©   (2006-09-28 14:17) [3]

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

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

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


 
ANB ©   (2006-09-28 14:20) [4]

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


 
DSKalugin ©   (2006-09-28 14:45) [5]

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


 
kaif ©   (2006-09-28 15:08) [6]

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

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


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


 
Sergey13 ©   (2006-09-28 15:13) [7]

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

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


 
ANB ©   (2006-09-28 16:34) [8]


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

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


 
Anatoly Podgoretsky ©   (2006-09-28 19:29) [9]


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

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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.074 c
15-1163637724
Tirael
2006-11-16 03:42
2006.12.03
я тоже нихочу никого обидеть но...


15-1163671607
ANT1
2006-11-16 13:06
2006.12.03
Лицензии


2-1163843897
GhostOld
2006-11-18 12:58
2006.12.03
Как удалить из строки знаки переноса строки #13#10?


15-1163494454
ORMADA
2006-11-14 11:54
2006.12.03
Сообщество Delphi7 развивает свою версию delphi


15-1163485098
Denniz
2006-11-14 09:18
2006.12.03
Синяя панель Windows Explorer