Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.028 c
2-1163497639
new1
2006-11-14 12:47
2006.12.03
проблема в создании dbf-файла


15-1163496882
европанедлянас
2006-11-14 12:34
2006.12.03
WAP


15-1163508842
Андрей Сенченко
2006-11-14 15:54
2006.12.03
DOC. Память для EXEC


4-1153425976
Батыр
2006-07-21 00:06
2006.12.03
Как узнать цвет заданной точки экранна


4-1153305977
DelphiN!
2006-07-19 14:46
2006.12.03
Отследить измениение списка запущенных в системе процессов




   Наверх