Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
11-1139940307
Boguslaw
2006-02-14 21:05
2006.12.03
MSEGUI


3-1159422895
vodvorezlaya
2006-09-28 09:54
2006.12.03
Где хранится список всех компонентов TDataSource на форме


2-1163495203
MishaLukash
2006-11-14 12:06
2006.12.03
DBGrid.Columns.Width не отображает поле во всю длинну


2-1163530917
Павел123456
2006-11-14 22:01
2006.12.03
Как узнать имя компонента по которому кликнули мышью?


2-1163591974
Толян__
2006-11-15 14:59
2006.12.03
Архивировать файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский