powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужна замена значения, а ВК мешает
14 сообщений из 14, страница 1 из 1
Нужна замена значения, а ВК мешает
    #38937565
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вразумите, добрые люди.

Локальная БД FB 2.5 (embedded).

На клиенте (Delphi) в цикле происходит добавление записей в две таблицы (по 2-4-6-8 записей).
Одну назовем MAIN, другую Tbl2. Они мало зависимы и вторая упомянута для полноты картины.
Запись в обе таблицы идет в одной транзакции.
Конструкция эта нормально работала долгое время, пока на авансцене не появилась третья таблица.
Для краткости имя ее Tbl3 и связана она с MAIN по ВК для каскадного удаления:
FK_TBL3_1 на поле ID_MAIN, вн.таблица MAIN, вн.поле ID, правило удаления CASCADE
Удаление тоже благополучно отрабатывало и отрабатывает.

Но вот понадобилось в Tbl3 заменить значение в ID_MAIN, меняя, таким образом владельца.
И на беду как раз в той же самой транзации, в которой пишется добавление в MAIN.
Происходит, понятно что: клиент запрашивает новое значение ID для MAIN, записывает данные в эту таблицу и, затем, надо заменить в Tbl3 значение в поле ID_MAIN на полученное для MAIN новое ID.
Но транзакция еще не завершилась и запись в MAIN не видна - получаем облом обновления значения в Tbl3 из-за наличия ВК:
'violation of FOREIGN KEY constraint ... Foreign key reference target does not exist'

Т.к. разрывать, делить транзакцию нельзя, то вроде бы, ничего не остается делать как пристрелить этот FK и на клиенте заняться удалением.

Но теплится призрачная надежда, что может есть что-то типа "волшебного слова, зелья, приворота",
чтобы в рамках одной транзакции и добавить записи и обновление сделать по ID добавленной но не существующей в рамках транзакции записи?
Или оставь надежду всяк такое придумавший?
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937573
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

ничего не понял. Приводи воспроизводимый пример в ISQL
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937575
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, San_01_08!
You wrote on 15 апреля 2015 г. 18:01:13:

San_01_08обновление сделать по ID
добавленной но не cуществующей
в рамках транзакции записипомедленнее.
я записываю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937599
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисSAN_01_08,
ничего не понял. Приводи воспроизводимый пример в ISQL
Ну как здесь привести пример из клиентской программы? Еще хуже будет.
В таблице MAIN есть поле ID и другие, которые в этой ситуации роли не играют.
В таблице Tbl3 есть ВК на это поле ID из MAIN
Ситуация проста как галоша:
- запускается транзакция;
- берется новое значение ID из генератора;
- добавляется запись в MAIN с этим новым значением ID;
- теперь в Tbl3 в поле ID_MAIN надо заменить то значение что там было на это новое, полученное для MAIN;

Т.к. к моменту обновления таблицы Tbl3 транзакция не завершена, то ВК не может найти запись в MAIN с новым ID и
генерит вышеуказанную ошибку.
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937605
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Ситуация проста как галоша:
- запускается транзакция;
- берется новое значение ID из генератора;
- добавляется запись в MAIN с этим новым значением ID;
- теперь в Tbl3 в поле ID_MAIN надо заменить то значение что там было на это новое, полученное для MAIN;

Т.к. к моменту обновления таблицы Tbl3 транзакция не завершена, то ВК не может найти запись в MAIN с новым ID и
генерит вышеуказанную ошибку.Это означает, что
а) апдейт Tbl3 происходит не в той тр-ции, в которой был инсерт в MAIN, или
б) в Tbl3 присваивается не то значение, которое вставлено в MAIN, или
в) где-то (в Tbl3 ?) есть злобные триггеры, которые портят картинку
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937610
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть мое предположение о причине ошибки и не верное, но
а) одна транз. и для инсерта и для апдейта. Отвечаю.
б) пишется то значение, которое надо. Проверено в отладке.
в) триггеров на таблицу Tbl3 нет.

Если таблицу апдейтить в другой транзакции, то ВК не мешает и ошибки нет.
Но нужна именно одна транзакция.
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937641
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе уже сказали: делай тесткейс в isql и покажи нам как оно нарушается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937642
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

воспроизведи в isql
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937662
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что такое isql?
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937664
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как в isql воспризвести две операции в одной транзакции?
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937710
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

нет слов.
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937760
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladSAN_01_08,

нет слов.
Здесь МП нужен. Лучше него кратко и емко объяснить ситуацию вряд ли кто-то сможет
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38937830
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08чтобы в рамках одной транзакции и добавить записи и обновление сделать по ID добавленной но не существующей в рамках транзакции записи?
три раза прочитал, что-то ересь какая-то.
Это типа как сначала создать заказ, а потом создавать или записи использовавшихся в нем товаров, или запись клиента, делающего заказ.
Foreign key reference target does not exist означает совершенно конкретное - в справочнике нет записи с id, который пытаются использовать в таблице.

Насчет транзакций тоже муть какая-то. В одной транзакции никаких нет проблем создать запись справочника и потом сослаться на нее в другой таблице.
В разных транзакциях - да, будет эта самая проблема. Потому что транзакция со ссылкой не видит вставленной в справочник в другой транзакции записи. Для этого надо транзакцию со вставкой в справочник сначала завершить (commit), и более того, транзакция ссылающаяся на этот справочник не должна быть snapshot.
...
Рейтинг: 0 / 0
Нужна замена значения, а ВК мешает
    #38938516
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Ситуация проста как галоша:
- запускается транзакция;
- берется новое значение ID из генератора;
- добавляется запись в MAIN с этим новым значением ID;
- теперь в Tbl3 в поле ID_MAIN надо заменить то значение что там было на это новое, полученное для MAIN;

Вот если последний и предпоследний пункты местами поменять, то будет наблюдаться описанная картина.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужна замена значения, а ВК мешает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]