![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Еще раз о генераторах :) [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. Придется иногда генерить до вставки, но это твой триггер понимает.