Форум: "Базы";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизЕще раз о генераторах :) Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c