Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/55: Рейтинг темы: голосов - 55, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 5

Ошибка violation of PRIMARY or UNIQUE KEY при работе с базой Firebird (DataSnap)

21.04.2017, 12:13. Показов 12074. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!

Помогите,пожалуйста, если кто может подсказать, помочь советом..

Есть сервер DataSnap, который обновляет таблицы в базе данных Firebird. База создавалась не мной, я работаю с тем, что есть (разве что хранимые процедуры могу добавлять).

Так вот на сервере есть метод, в котором обновляется поле f1 таблицы t1 (хр.проц. my_proc1), и если всё прошло успешно, и выполнено еще некоторое условие, то следом идёт обновление поля f2 той же таблицы (хр.проц. my_proc2).
(это для простоты имена полей и таблиц заменены на t1, f1 и т.д.)

вообще, суть метода примерно такая:
1.сначала из базы получается исходное значение поля f1 (GET_F1)
2.затем с ним проводятся некие манипуляции
3.затем вызывается хранимая процедура MY_PROC1
4.и если всё хорошо, то вызывается ХП MY_PROC2

А в базе присутствует триггер, который перед обновлением записи в таблице t1 копирует обновляемую запись в таблицу hist_t1
SQL
1
2
3
4
5
6
7
CREATE OR ALTER TRIGGER T1_BU1 FOR T1
active BEFORE UPDATE POSITION 1
AS
BEGIN
  INSERT INTO hist_t1(dcode, upl_date, f1, f2)
  VALUES (NEW.dcode, CURRENT_TIMESTAMP, NEW.f1, NEW.f2);
END
Таким образом, после выполнения метода сервера в hist_t1 могут быть две почти одинаковые записи. "Почти" - потому что часть первичного ключа в hist_t1 - это поле типа timestamp, и эти две записи могут различаться только по этому полю на несколько миллисекунд.

Суть моей беды в том, что периодически возникает ошибка
Ошибка TDBXError: violation of PRIMARY or UNIQUE KEY constraint "HISTT1_PK" on table "HIST_T1"
Problematic key value is ("DCODE" = 2, "UPL_DATE" = '2017-04-21 12:31:36.7970')
At trigger 'T1_BU1' At procedure 'MY_PROC2'


То есть, как я понимаю, триггер пытается добавить в hist_t1 запись с неуникальным ключом
Перед первым обновлением таблицы t1 запись в hist_t1 добавляется, а перед вторым обновлением хочет добавиться точно такая же

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

Это мой первый опыт с datasnap, возможно, чего-то еще не знаю/не понимаю
Подскажите, пожалуйста, куда копать, что исправлять.

Delphi XE2
Сервер Firebird 2.1
в свойствах SQLConnection1:
Code
1
2
ConnectionName=FBConnection
Driver=Firebird
в свойствах DSServerClass:
Code
1
LifeCycle=Session
В процедуре TServerMethods1.DSServerModuleCreate идет подключение к базе:

Delphi
1
2
3
4
5
6
7
8
9
10
11
  SQLConnection1.Params.Values['Database']:=strDataBaseName;
  TRY
      SQLConnection1.Connected:=true;
      result:=true;
  EXCEPT
    on err:TDBXError do begin
       loginfo('Ошибка '+err.Message);
       result:=false;
    end
    else raise;
  END;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2017, 12:13
Ответы с готовыми решениями:

Ошибка violation of primary key
на форме есть dbgrid в нём таблица InterBase, создал другую форму для изменения записей в таблице... вот собственно код изменения данных ...

Отследить исключение Primary Или Unique key
Есть таблица. В ней первичный ключ и уникальный ключ. Когда я в делфи добавляю запись, в которой уникальный ключ повторяет значение,...

violation of PRIMARY or UNIQUE KEY
привет. есть таблица в базе FDB, в ней есть уникальный индекс (PK) без автоинкремента (изменять нельзя). при добавлении в эту таблицу...

5
 Аватар для kebot
9 / 9 / 4
Регистрация: 11.07.2012
Сообщений: 200
21.04.2017, 13:21
а чем обусловлена необходимость - составного первичного ключа ?
скорее всего этих проблем удастся избежать если будет обычное одиночное id поле в качестве pk
0
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 5
21.04.2017, 13:56  [ТС]
да я в общем-то тоже так думаю, но мне досталась база уже с готовой структурой, сказали, менять ничего нельзя, можно только добавить что-то своё и с этим работать (таблицы, процедуры, генераторы...).
а эта таблица вместе с триггером уже были.

причем у меня на компе такой ошибки не было

может, нужно каким-то образом параметры задать у SQLConnectioin1?
Code
1
2
3
CommitRetain=False
WaitOnLocks=True
IsolationLevel=ReadCommited
или что-то еще поменять. просто не понимаю, почему ошибка не всегда возникает, с чем это связано
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,660
Записей в блоге: 21
21.04.2017, 14:10
если быстро вставлять, то таймстамп будет шибко одинаковым, поэтому и совпадет
нужно ставить замедление чтобы пара миллисекунд уходила )))
но это конечно треш
0
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 5
21.04.2017, 14:45  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
если быстро вставлять, то таймстамп будет шибко одинаковым, поэтому и совпадет
так-то оно так)
при выполнении методов сервера велся лог в текстовый файл, добавила еще миллисекунды, так там записи обоих обновлений по времени совпадают до мс, причем всегда. а ошибка не всегда появляется

Цитата Сообщение от krapotkin Посмотреть сообщение
нужно ставить замедление чтобы пара миллисекунд уходила )))
если делать какое-то замедление на 1-2мс, то как это будет выглядеть в методе?

дали добро на небольшое изменение триггера, вместо insert написала update or insert. теперь он такой
пока вроде всё нормально)
SQL
1
2
3
4
5
6
7
CREATE OR ALTER TRIGGER T1_BU1 FOR T1
active BEFORE UPDATE POSITION 1
AS
BEGIN
  UPDATE OR INSERT INTO hist_t1(dcode, upl_date, f1, f2)
  VALUES (NEW.dcode, CURRENT_TIMESTAMP, NEW.f1, NEW.f2);
END
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,660
Записей в блоге: 21
21.04.2017, 15:08
select max(id) from table where. ...
вполне даст нам пару
но UPSERT конечно лучше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2017, 15:08
Помогаю со студенческими работами здесь

Ошибка при заполнении пустой таблицы: Violation of Primary Key constraint
Всем привет. С базами данных я на Вы. Установил SQL_EXPRESS_2014. В менеджмент студио запустил SQL-скрипт для создающий пять таблиц. ...

Ошибка "Violation of primary key constraint" при update
Написал программку. При нажатии на кнопку "обновить" должна происходить синхронизация между базой данных и DataGrid (посредством метода...

При добавлении записи в БД происходит ошибка "violation of PRIMARY KEY constraint)"
Ребята, тут такая неразбериха, я по идее правильные ввожу данные, но почему то выскакивает данная ошибка на срине. До этого я еще настроил...

Ошибка в запросе на добавление строки: Violation of PRIMARY KEY constraint
private void button1_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(@"Data...

Violation of Primary key constraint 'PK_otdel'. Cannot insert dupllicate key in object 'dbo.otdel'.
void __fastcall TAddOtdForm::AddOtdButton1Click(TObject *Sender) { int kodotd; MainForm->OtdelADOQuery1->Last(); kodotd =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru