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

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

21.04.2017, 12:13. Показов 6996. Ответов 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:
Код
ConnectionName=FBConnection
Driver=Firebird
в свойствах DSServerClass:
Код
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2017, 12:13
Ответы с готовыми решениями:

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

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

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

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

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

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

может, нужно каким-то образом параметры задать у SQLConnectioin1?
Код
CommitRetain=False
WaitOnLocks=True
IsolationLevel=ReadCommited
или что-то еще поменять. просто не понимаю, почему ошибка не всегда возникает, с чем это связано
0
5087 / 3967 / 1309
Регистрация: 14.04.2014
Сообщений: 18,259
Записей в блоге: 18
21.04.2017, 14:10 4
если быстро вставлять, то таймстамп будет шибко одинаковым, поэтому и совпадет
нужно ставить замедление чтобы пара миллисекунд уходила )))
но это конечно треш
0
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 5
21.04.2017, 14:45  [ТС] 5
Цитата Сообщение от 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
5087 / 3967 / 1309
Регистрация: 14.04.2014
Сообщений: 18,259
Записей в блоге: 18
21.04.2017, 15:08 6
select max(id) from table where. ...
вполне даст нам пару
но UPSERT конечно лучше
0
21.04.2017, 15:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2017, 15:08

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru