Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сбой в работе генератора, firebird 2.1 
V
    Опции темы
Cinemaizer[Олег]
Дата 20.1.2011, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



Использую D7 + FibPlus 6.9.9 + Firebird 2.1. База в локальном режиме, 1 юзер, хотя потом планируется многопользовательская работа.

В общем, впервые для себя обнаружил ошибку вот такого вида:

Цитата

DM.dsetNOMENKLATURA_F.InsertQuery:

Invalid insert or update value(s): object columns are
constrained - no 2 table rows can have duplicate column values.

Violation of PRIMARY or UNIQUE KEY constraint "PK_NOMENKLATURA" on table "NOMENKLATURA".


Не подозревал, что даже в локальном режиме могут быть проблемы с первичным ключом, точнее с генератором. Поясню подробнее: есть таблица-справочник номенклатуры, в которой на данный момент 211 записей. При добавлении новой записи (точнее при Post) возникает вышеобозначенная ошибка. Посмотрел текущее значение генератора в IB Experte и был удивлен - значение 39, когда явно должно быть 211. Скрипт генератора-триггера для таблицы классический: 

Код

CREATE GENERATOR GEN_NOMENKLATURA_ID;
SET GENERATOR GEN_NOMENKLATURA_ID TO 0;

CREATE OR ALTER TRIGGER NOMENKLATURA_BI FOR NOMENKLATURA
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_nomenklatura_id,1);
end


Настройки фибдатасета тоже обычные в принципе:

user posted image

Вопрос - каким образом и что могло повлиять на значение генератора, которое по логике должно быть максимальным  ?

Добавлено @ 23:43
что еще хотел добавить по теме, что никаких процедур и вообще чего либо, меняющего значение генератора данной таблицы не используется вообще, кроме того что описал.

Это сообщение отредактировал(а) Cinemaizer[Олег] - 21.1.2011, 01:18
PM MAIL WWW   Вверх
vovk
Дата 21.1.2011, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 28.2.2008

Репутация: 6
Всего: 6



триггер будет пользоватся генератором для Id толлько если при добавлении вы передали NULL для поля Id. А можно увидеть запросы добавления-обновления?
PM MAIL   Вверх
Cinemaizer[Олег]
Дата 21.1.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



Что характерно, читая статью про генераторы:
http://ibase.ru/devinfo/generator.htm


нашел следующее:
Цитата

Сбои в работе

Как уже говорилось выше, генераторы не подвержены влиянию транзакций, и казалось бы, должны инкрементироваться всегда. Увы, иногда при сбоях сервера (выключение питания, падение ОС и т.п.) страницы генераторов не успевают сохраниться на диск, хотя данные, записанные по commit, сохраняются. Более вероятна такая ситуация при Forced Write = Off.
В результате, после рестарта сервера, в базе могут оказаться "старые" значения генераторов, при том что данные уже содержат идентификаторы, полученные от "новых" значений.

Это исправлено в Firebird 1.5.2, то есть страницы генераторов записываются на диск до записи страниц с данными. На других версиях Interbase/Firebird/Yaffil с данной проблемой можно бороться только написав специальную программу "восстановления" или контроля значений генераторов после сбоя, которая будет содержать проверку на select max(id) from table и установку соответствующего генератора в это значение.


В итоге выходит, что у меня как раз та самая "другая версия" Firebird  smile и надо внедрять select max(id) ?

Добавлено @ 01:09
Цитата(vovk @ 20.1.2011,  22:52)
триггер будет пользоватся генератором для Id толлько если при добавлении вы передали NULL для поля Id. А можно увидеть запросы добавления-обновления?


ок, что было сгенерировано автоматическим способом в настройках фибдатасета. в моем коде ничего в рантайме не меняю:


INSERT INTO NOMENKLATURA(
    ID,
    NTYPE_ID,
    NGROUP_ID,
    NAME,
    NAME_FOR_PRINT,
    UID,
    UNITS_ID,
    DEFAULT_NUMBER,
    MIN_REST,
    RETAIL_PRICE,
    MARKUP,
    ARTIKUL,
    POT_PROFIT_CATEGORY,
    PURCH_PRICE,
    VENDOR,
    ADDINPRICELIST,
    PRIZN_NOMENKL_ID,
    NOTES,
    PHOTO,
    DELETED,
    DEL_BY,
    DEL_DATE,
    DEL_TIME
)
VALUES(
    :ID,
    :NTYPE_ID,
    :NGROUP_ID,
    :NAME,
    :NAME_FOR_PRINT,
    :UID,
    :UNITS_ID,
    :DEFAULT_NUMBER,
    :MIN_REST,
    :RETAIL_PRICE,
    :MARKUP,
    :ARTIKUL,
    :POT_PROFIT_CATEGORY,
    :PURCH_PRICE,
    :VENDOR,
    :ADDINPRICELIST,
    :PRIZN_NOMENKL_ID,
    :NOTES,
    :PHOTO,
    :DELETED,
    :DEL_BY,
    :DEL_DATE,
    :DEL_TIME
)



UPDATE NOMENKLATURA
SET 
    NTYPE_ID = :NTYPE_ID,
    NGROUP_ID = :NGROUP_ID,
    NAME = :NAME,
    NAME_FOR_PRINT = :NAME_FOR_PRINT,
    UID = :UID,
    UNITS_ID = :UNITS_ID,
    DEFAULT_NUMBER = :DEFAULT_NUMBER,
    MIN_REST = :MIN_REST,
    RETAIL_PRICE = :RETAIL_PRICE,
    MARKUP = :MARKUP,
    ARTIKUL = :ARTIKUL,
    POT_PROFIT_CATEGORY = :POT_PROFIT_CATEGORY,
    PURCH_PRICE = :PURCH_PRICE,
    VENDOR = :VENDOR,
    ADDINPRICELIST = :ADDINPRICELIST,
    PRIZN_NOMENKL_ID = :PRIZN_NOMENKL_ID,
    NOTES = :NOTES,
    PHOTO = :PHOTO,
    DELETED = :DELETED,
    DEL_BY = :DEL_BY,
    DEL_DATE = :DEL_DATE,
    DEL_TIME = :DEL_TIME
WHERE
    ID = :OLD_ID
    


Это сообщение отредактировал(а) Cinemaizer[Олег] - 21.1.2011, 01:13
PM MAIL WWW   Вверх
vovk
Дата 21.1.2011, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 28.2.2008

Репутация: 6
Всего: 6



У меня стоит  Firebird 2.1.3 FIB 6.9.6 за год подобного ниразу не было, правда embedded редко использовался.
PM MAIL   Вверх
Cinemaizer[Олег]
Дата 21.1.2011, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



Цитата(vovk @ 20.1.2011,  23:11)
У меня стоит  Firebird 2.1.3 FIB 6.9.6 за год подобного ниразу не было, правда embedded редко использовался.

так вот и я удивляюсь тоже весьма... где хвосты проблемы искать, не знаю... может на всякий случай действительно "селект макс" вставить?
PM MAIL WWW   Вверх
vovk
Дата 21.1.2011, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 28.2.2008

Репутация: 6
Всего: 6



Правда у меня в основном на процедурах и триггерах работа с  идентификаторами, а там где надо программно получить ID использую не wgBeforePost а wgOnNewRecord для гарантии так сказать)) мне ведь по сути не важно какое там число будет записано, лиш бы гарантироано уникальное. Пусть уж лучше пару тройку значений пропустит при возможных сбоях, или отказах от сохранения.

Это сообщение отредактировал(а) vovk - 21.1.2011, 01:26
PM MAIL   Вверх
Deniz
Дата 21.1.2011, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Cinemaizer[Олег)
, 21.1.2011,  02:58, post2286348]В итоге выходит, что у меня как раз та самая "другая версия" Firebird
нет.
Написано же: "Это исправлено в Firebird 1.5.2", имеется ввиду в версии >= 1.5.2.
Как думаешь, твоя версия (2.1) вышла раньше чем 1.5.2?
Цитата(Cinemaizer[Олег)
, 21.1.2011,  01:38, post2286326]Поясню подробнее: есть таблица-справочник номенклатуры, в которой на данный момент 211 записей.
Вопрос: как они туда попали? Через твою программу или импортировались из стороннего справочника?
Может значение генератора кто-то принудительно установил?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Cinemaizer[Олег]
Дата 21.1.2011, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



Цитата

В итоге выходит, что у меня как раз та самая "другая версия" Firebird

Это была шутка юмора такая  smile

Добавлено @ 07:32
Цитата

Вопрос: как они туда попали? Через твою программу или импортировались из стороннего справочника? 

Попали через мою программу.
Цитата

Может значение генератора кто-то принудительно установил?

Исключено


Это сообщение отредактировал(а) Cinemaizer[Олег] - 21.1.2011, 07:34
PM MAIL WWW   Вверх
Frees
Дата 21.1.2011, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



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


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Deniz
Дата 21.1.2011, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Frees @  21.1.2011,  09:44 Найти цитируемый пост)
FIB умеют свои настройки сохранять где попало, и потом их подхватывать, то что ты видишь в дизайне не значит что все также будет в рунтайме. 
 smile 
А поподробнее?
Цитата(Cinemaizer[Олег)
, 21.1.2011,  09:31, post2286381]Попали через мою программу.
и сервер не падал?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Cinemaizer[Олег]
Дата 21.1.2011, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



Цитата

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

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

и сервер не падал?

а чего ему падать то? локалка, 1 юзер.

Добавлено через 9 минут и 31 секунду
Цитата(Deniz @  21.1.2011,  05:51 Найти цитируемый пост)
Цитата(Frees @  21.1.2011,  09:44 )
FIB умеют свои настройки сохранять где попало, и потом их подхватывать, то что ты видишь в дизайне не значит что все также будет в рунтайме. 
  
А поподробнее?

Кстати да, можно подетальнее про это дело???


Это сообщение отредактировал(а) Cinemaizer[Олег] - 21.1.2011, 08:44
PM MAIL WWW   Вверх
Frees
Дата 21.1.2011, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(Deniz @  21.1.2011,  10:51 Найти цитируемый пост)
А поподробнее?

у TpFIBDatabase еслт опция ddoStoreConnected она может напакастить... была проблема с диалектом в дизайне одно при запуске другой, оказалось что FIB сохранил в реестре не правильную настройку диалекта...

не факт что эта опция может повлеять но TpFIBDataSet но все же....

Это сообщение отредактировал(а) Frees - 21.1.2011, 08:59


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Deniz
Дата 21.1.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Frees, что-то странное ты про диалекты рассказываешь.
Если БД была создана в 1-м, то что ни ставь в дизайн, в ран будет всегда 1
Если БД была создана в 3-ем, то подключиться к ней с 1 тоже проблема.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Cinemaizer[Олег]
Дата 21.1.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



Точно, Frees был прав. Поскольку дело было глубоким ночером, то вследствие копипастинга или усталости не углядел, как "чужие" датасеты втихую генерят мой номенклатурный генератор.  smile 
В общем, тема закрыта. Всем спасибиссимо за участие!!!
PM MAIL WWW   Вверх
Frees
Дата 21.1.2011, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(Deniz @  21.1.2011,  12:30 Найти цитируемый пост)
Frees, что-то странное ты про диалекты рассказываешь.Если БД была создана в 1-м, то что ни ставь в дизайн, в ран будет всегда 1Если БД была создана в 3-ем, то подключиться к ней с 1 тоже проблема.

Дело было так, БД была создана в 3 диалекте в дизайне стоял 3 диалект, а после запуска в отладке показывал диалект 1...дело оказалось в опции ddoStoreConnected...

Это сообщение отредактировал(а) Frees - 21.1.2011, 15:01


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0939 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.