![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уникальный ключ позволяет добавить дублирующиеся значения [D5, IB6.x]
Sergey Ivanov © (2006-03-07 12:07:00)Уникальный ключ позволяет добавить дублирующиеся значения.
Как такое может быть?
Воспроизвести на тестовой базе не могу, а у пользователей постоянно проблемы.
С уважением Иванов Сергей.
Sergey Ivanov (2006-03-07 16:44:00) [1]В общем то, я так и думал, надеялся только, что мне скажут, что это всё фигня... :-)
Но, всё равно спасибо!
Sergey13 (2006-03-07 16:00:00) [2]2[16] Sergey Ivanov (07.03.06 13:52)
Любой DDL в программе - это уже не хорошо.
Sergey Ivanov (2006-03-07 13:52:00) [3]А если перед заливкой пересоздавать таблицы, это дурной тон?
Desdechado (2006-03-07 13:38:00) [4]значит, исходная БД перед заливкой в нее уже с порченым индексом, который не может отследить дубли
Sergey Ivanov (2006-03-07 13:28:00) [5]Автор - я. Не ковыряюсь. Процедура ВСЯ выше.
запрос в ibqLBarcodes
select
BRC_KRD_ID,
BRC_CODE,
BRC_TIMESTAMP,
BRC_STG_ID,
BRC_USER,
BRC_ACTIVE
from
BARCODES
order by
BRC_CODE;
updatesql:
update BARCODES
set
BRC_KRD_ID = :BRC_KRD_ID,
BRC_CODE = :BRC_CODE,
BRC_TIMESTAMP = :BRC_TIMESTAMP,
BRC_STG_ID = :BRC_STG_ID,
BRC_USER = :BRC_USER,
BRC_ACTIVE = :BRC_ACTIVE
where
BRC_CODE = :OLD_BRC_CODE
insert into BARCODES
(BRC_KRD_ID, BRC_CODE, BRC_TIMESTAMP, BRC_STG_ID, BRC_USER,
BRC_ACTIVE)
values
(:BRC_KRD_ID, :BRC_CODE, :BRC_TIMESTAMP, :BRC_STG_ID, :BRC_USER,
:BRC_ACTIVE)
Desdechado (2006-03-07 13:19:00) [6]есть подозрения, что автор ковыряется в системных таблицах при "заливке"
Sergey Ivanov (2006-03-07 13:16:00) [7]Конечно BRC_CODE
Sergey13 (2006-03-07 13:06:00) [8]2[8] Sergey Ivanov (07.03.06 12:52)
А что в эих полях ПК? BRC_KRD_ID или BRC_CODE?
Sergey13 (2006-03-07 13:00:00) [9]2 [9] Desdechado © (07.03.06 12:55)
Просто другого способа получить дубли в ПК я не придумал. 8-)
Desdechado (2006-03-07 12:55:00) [10]Sergey13 © (07.03.06 12:23) [5]
в IB нельзя его отключить
а даже если б можно было, его потом ведь не включишь из-за дублей
Sergey Ivanov (2006-03-07 12:52:00) [11]Лечить я уже научился :-)
Программа закачки моя. Все просто до безобразия.
Хочется не попадать в дальнейшем. А не понимаю как такое может быть.
with dbfBarcodes do begin
FilePath := ImpDir;
end;
with ibqLBarcodes.Transaction do begin
if Active then
Rollback;
StartTransaction;
end;
ibqLBarcodes.Open;
with dbfBarcodes do begin
Open;
RowsDone := 0;
RowsTotal := RecordCount;
First;
while not Eof do begin
if ibqLBarcodes.Locate('BRC_CODE',dbfBarcodesBRC_CODE.AsString,[]) then begin
ibqLBarcodes.Edit
end else begin
ibqLBarcodes.Append;
end;
ibqLBarcodesBRC_KRD_ID.AsInteger := dbfBarcodesBRC_KRD_ID.AsInteger;
ibqLBarcodesBRC_CODE.AsString := dbfBarcodesBRC_CODE.AsString;
ibqLBarcodesBRC_USER.AsInteger := dbfBarcodesBRC_USER.AsInteger;
ibqLBarcodesBRC_STG_ID.AsInteger := dbfBarcodesBRC_STG_ID.AsInteger;
ibqLBarcodesBRC_ACTIVE.AsInteger := 1;
//MainForm.StatusShow(ibqLBarcodesBRC_CODE.AsString);
ibqLBarcodes.Post;
Next;
RowsDone := RowsDone + 1;
Gauge1.Progress := round(RowsDone / RowsTotal * 100);
Application.ProcessMessages;
end;
end;
with ibqLBarcodes.Transaction do begin
if Active then
Commit;
end;
Sergey13 (2006-03-07 12:40:00) [12]2[6] Sergey Ivanov (07.03.06 12:31)
>Как можно перестроить индексы по всем таблицам при старте программы?
Не надо этого делать.
Надо проверить программу закачки "справочника чого-то там".
В работающей базе удали ключ. Найди дубликаты и грохни их по альтернативным ключам (возможно для этого придется создать временный первичный ключ). Восстанови ключ.
Я бы наверное пошел по такому пути. Естественно запасся бы страховочными копиями (файловое копирование с отключенным сервером).
Sergey Ivanov (2006-03-07 12:31:00) [13]Desdechado © (07.03.06 12:21) [4]
Не поможет. Не восстановиться.
gbak: ERROR: attempt to store duplicate value (visible to active transactions) in unique index "RDB$PRIMARY22"
gbak: Index "RDB$PRIMARY22" failed to activate because:
gbak: The unique index has duplicate values or NULLs.
gbak: Delete or Update duplicate values or NULLs, and activate index with
gbak: ALTER INDEX "RDB$PRIMARY22" ACTIVE;
Я что то не так делаю, а что не пойму. Как такое получить программно? Индексы не отключаются, транзакции используются явно.
Как можно перестроить индексы по всем таблицам при старте программы?
Sergey13 (2006-03-07 12:23:00) [14]2[2] Sergey Ivanov (07.03.06 12:17)
>В базу закачивается справочник чого-то там
А индексы при этом не отключаются случаем?
Desdechado (2006-03-07 12:21:00) [15]порченый индекс - backup-restore поможет
Плохиш (2006-03-07 12:20:00) [16]
> Sergey Ivanov (07.03.06 12:07)
> Уникальный ключ позволяет добавить дублирующиеся значения.
Это уже неуникальный ключ.
Sergey Ivanov (2006-03-07 12:17:00) [17]Sergey13 © (07.03.06 12:10) [1]
Да какое гнать - упарился уже.
В базу закачивается справочник чого-то там. возможно в источнике записей и есть такие дублирующиеся значения, но как они остаются в базе - не понятно, а на следующий раз Update failed и все.
Sergey13 (2006-03-07 12:10:00) [18]2Sergey Ivanov (07.03.06 12:07)
>Уникальный ключ позволяет добавить дублирующиеся значения.
Да ладно гнать то. 8-)
>IB6.x
выкинь его нафики поставь FireBird