Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

Автоинкреаментное поле   Найти похожие ветки 

 
Sinus ©   (2006-09-23 17:33) [0]

Привет всем ,
есть БД ( пример из папки CommonFiles\Borland\data ),
при попытке вставить запись в таблицу "Работников" поле ИД
не заполняю и при сохранении записи генерируется исключение
"Поле ID не заполненно ", если же заполняю - необходимо проверять вводимое значени на отсуствие в таблице.
Вопрос по чему автоматически не генерируется число из  генератора и не вставляется в поле ИД ?


 
Desdechado ©   (2006-09-23 17:39) [1]

читать ibase.ru

ЗЫ генератор - сама по себе сущность
привязка генератора к полю таблицы выполняется триггером, например, BEFORE INSERT


 
Sinus ©   (2006-09-23 17:46) [2]

Генератор уже привязан к поля таблицы  ...
-(


 
Desdechado ©   (2006-09-23 18:04) [3]

повторю - читать ibase.ru

исключение может давать Д, тогда сделай поле в настройках компонентов необязательным или же заполняй его нулем, например
и триггер ACTIVE

и думать больше


 
dr Gonzo ©   (2006-09-25 11:14) [4]

0. Таблица допустим  

Table_1 ( PkId   INT, Field1  INT)
1. Должен присутствовать генератор:

Например создать генератор G_Table_1

2. Присваиваем значение генератора в тригере перед Insert"oм :

CREATE TRIGGER Table_1_BeforePost FOR Table_1
ACTIVE BEFORE INSERT POSITION 0
AS
begin
 IF (NEW.PkId IS NULL) THEN
   NEW.PkId =  GEN_ID(G_Table_1, 1);
end


3. Если нужно получить значение только что сгенерированного значения
генератора то используем:

X = GEN_ID(G_Table_1, 0);


 
Sergey13 ©   (2006-09-25 11:18) [5]

> [4] dr Gonzo ©   (25.09.06 11:14)

> 3. Если нужно получить значение только что сгенерированного
> значения
> генератора то используем:
>
> X = GEN_ID(G_Table_1, 0);

Теоретически можно нарваться на неприятности.


 
dr Gonzo ©   (2006-09-25 12:02) [6]

X = GEN_ID(G_Table_1, 0);

Обычно применяется в транзакции, сразу после вставки, для возвращения ID только что созданной записи. Если есть еще способы прошу поделиться.


 
Sergey13 ©   (2006-09-25 12:04) [7]

> [6] dr Gonzo ©   (25.09.06 12:02)
> Обычно применяется в транзакции, сразу после вставки, для
> возвращения ID только что созданной записи. Если есть еще
> способы прошу поделиться.

Генератор работает ВНЕ контекста транзакции. Поэтому надо получать значение не ПОСЛЕ вставки, а ДО нее, и использовать далее полученное значение.


 
dr Gonzo ©   (2006-09-25 12:18) [8]

тогда правильнее создавать сразу процедуру на вставку, без использования тригера - это если нужно потом получать только что вставленное значение ID.


 
Виталий Панасенко   (2006-09-25 12:44) [9]


> dr Gonzo ©   (25.09.06 12:02) [6]
> X = GEN_ID(G_Table_1, 0);
>
> Обычно применяется в транзакции, сразу после вставки, для
> возвращения ID только что созданной записи. Если есть еще
> способы прошу поделиться.

FireBird 2.0+FIBPLus


 
Sergey13 ©   (2006-09-25 12:52) [10]

> [8] dr Gonzo ©   (25.09.06 12:18)

Правильнее чем что? И в чем принципиальная разница? И что даст отказ от тригера?


 
dr Gonzo ©   (2006-09-25 13:33) [11]

Правильнее сразу в теле процедуры на вставку получать новоре значение генератора (в переменную), записывать его в поле ID и его же возвращать в RETURN_VALUES. Чем использование тригера.


 
Sergey13 ©   (2006-09-25 13:42) [12]

> [11] dr Gonzo ©   (25.09.06 13:33)

Почему не правильнее это делать в клиенте?
Тригер срабатывает всегда, а ХП только когда ее вызовут. Улавливаешь разницу?


 
dr Gonzo ©   (2006-09-25 13:47) [13]

Я лично приверженец того, чтобы Insert Update таблиц был только через хранимые процедуры. При таком подходе в принципе удобнее всего получение ID вставлять как раз в хранимую процедуру на Insert объекта. Хотя можно продублировать и в тригере :)


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


> dr Gonzo ©   (25.09.06 13:33) [11]
> Правильнее сразу в теле процедуры на вставку получать новоре
> значение генератора (в переменную), записывать его в поле
> ID и его же возвращать в RETURN_VALUES. Чем использование
> тригера.

А как же "бизнес-логика на сервере"? тригер срабатывает на событие, генерируемой системой (БД). А ХП придется вызывать из приложения.. или опять же - из тригера...


 
Val ©   (2006-09-25 14:21) [15]

>А как же "бизнес-логика на сервере"?...
Вроде как от данного подхода не страдает, даже наоборот, многое, что должно/может сопутствовать вставке в данную табличку, можно красиво зашить в данную хп, получая неделимый для выполнения/отката блок.
...А из триггера айдишничек-то не вернешь...
Ну, впрочем, это давнишний холивар, больше не буду  :)


 
Виталий Панасенко   (2006-09-25 14:32) [16]


> ...А из триггера айдишничек-то не вернешь...
> Ну, впрочем, это давнишний холивар, больше не буду  :)

В ЖарПтице 2 с использоваением FIBPLus - аж бегом ! (ФИБы поддерживают эту возможность "двойки")


 
dr Gonzo ©   (2006-09-25 14:43) [17]

Тут получается размазывания кода в Delphi + SQL = что на мой взгляд глупо.

По идее, возвращаясь к началу темы, у нас должна быть хранимая процедура на сервере вида WorkerAdd (P1,P2,PN) которая возвращает код ошибки и  табельный номер и/или ID созданной записи. А уж потом для этой хранимой процедуры можно создать обертку в виде класса. Это мой личный подход.


 
Desdechado ©   (2006-09-25 17:46) [18]

я предпочитаю получать сгенеренный в триггере ID после успешной вставки записи путем вызова SELECT c уникальной комбинацией полей
тогда никаких коллизий


 
_Ламер_   (2006-09-25 19:05) [19]

А триггер может получить доступ к системным таблицам, если текущий юзер не имеет его? IB/FB, например.



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

Форум: "Базы";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.062 c
2-1162887021
V.I.P
2006-11-07 11:10
2006.11.26
работа с двумя таблицами выручайте


15-1163020114
Unit
2006-11-09 00:08
2006.11.26
Ресурс для новичков


15-1163106755
ArtemESC
2006-11-10 00:12
2006.11.26
Как FAR e закрепить режим сортировки?


1-1161092738
MegaVolt
2006-10-17 17:45
2006.11.26
Некорректно отображаются Hint в ListView с OwnrDraw :(


2-1162794333
Minimum
2006-11-06 09:25
2006.11.26
Combobox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский