powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Теряются записи в таблице
10 сообщений из 10, страница 1 из 1
Теряются записи в таблице
    #39879533
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Firebird 3.0.4.33054. ServerMode = Super

Уже не первый раз "теряются" записи в таблице. Не полностью, но доступ к "потерянным" записям можно получить только по индексу. Наполнение данной таблицы происходит в процедуре, где добавляются данные и в другие таблицы. А "теряются" только в одной. Таблица ничем принципиально не отличается от других, id - pk, пару внешних ключей, и пару блов полей.
Код: sql
1.
2.
select count(*) from table_name
select count(*) from table_name where id > 0


Второй запрос получает с таблицы на пару десятков записей больше.

Для восстановления делаю копию таблицы. Записываю в новую таблицу полученные данные с первой таблицы без использования ключа. Затем добавляю остальные записи полученные через ключ, помечаю их. Отключаю триггеры. Добавляю потерянные записи как новые. Переписываю внешние ключи к этим записям. Удаляю "потерянные" записи. На всякий бекап/ресторе.

Может кто сталкивался, подскажите что делать. И как, если что, быстро восстановить записи в этом случае, а то на процедуру описанную выше уходит не меньше часа.
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39879562
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

подозреваю что вот это

https://www.sql.ru/forum/1313832/fb3-0-portyatsya-indeksy-nevosstanovimyy-bekap?hl=?????????

gfix такое чинит. Вообще неплохо бы чтобы кто-то уже смог сделать воспроизводимый пример, чтобы это починили
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39879599
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисподозреваю что вот это
Да, прям один-в-один. Мы тоже перешли с 2.5 в этом году, и до этого не было ошибок вообще.
Только я бы сказал, что не индексы портятся, больше похоже, что между записью и таблицей связи нет. По индексу как раз таки можно к записи обратиться.
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39879602
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

там не понятный глюк когда некоторые DP помечаются как вторичные (страницы на которых только фрагменты или версии, без самих записей).
Они пропускаются при NATURAL SCAN.

Чтобы это исправить нужен воспроизводимый пример.
Ну или хотя бы поведуйте что с этой таблицей делалось, какой FW=ON/OFF?

Появится Влад может ещё чего спросит
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39879604
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПоявится Влад может ещё чего спроситВопросы всё те же самые
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39879623
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBE говорит, что Forced Writes включен.

Кажется нашел кое-что.
Таблица адресов клиентов "CLIENT_ADDRESSES". У одного клиента может быть несколько адресов и только один может использоваться по умолчанию. Поэтому в триггере AFTER UPDATE есть это:
Код: sql
1.
2.
3.
4.
5.
  if ((old.is_default = 0) and (new.is_default = 1)) then
    update client_addresses
    set is_default = 0
    where id_client <> new.id_client
      and is_default = 1;


а должно быть, наверное, это:
Код: sql
1.
2.
3.
4.
5.
6.
  if ((old.is_default = 0) and (new.is_default = 1)) then
    update client_addresses
    set is_default = 0
    where id_client = new.id_client
      and id <> new.id    
      and is_default = 1;


Первый запрос (отдельно от триггера) на не загруженной базе выполняется почти 2 сек. Меняет около 80к записей. Походу отваливается с ошибкой (завтра узнаю), т.к. судя по нему почти все записи должны быть с is_default = 0. Второй запрос выполняется мгновенно.
И все усугубляет запись во втором триггере на BEFORE UPDATE:
Код: sql
1.
2.
3.
  if ((old.is_default = 1) and (new.is_default = 0)) then
    if (not(exists(select * from client_addresses where id_client = new.id_client and id <> new.id))) then
      new.is_default = 1;



З.Ы. Так что единственное, что нужно тут исправлять - это кому-то руки...
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39879685
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрели программу, посмотрели код формы. Если просто менять эту галку, то все отрабатывает (если это можно так назвать) без ошибок. По коду в этой же транзакции может быть добавление, удаление и изменение других записей таблицы адресов. Вот тогда и вываливается ошибка памяти.
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39879725
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHSЗ.Ы. Так что единственное, что нужно тут исправлять - это кому-то руки...

кривизна вашей реализации никак не должна приводить к порче базы данных на физическом уровне. Так что вопрос остаётся открытым.
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39879741
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сохранил вчерашний бекап базы и код программы. Будет время - постараюсь повторить и свести базу до минимума.
...
Рейтинг: 0 / 0
Теряются записи в таблице
    #39885012
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пару раз пробовал повторить ошибку на сохраненной базе, но увы. Возможно нужно чтобы с таблицей работали под несколькими пользователями. Но после исправления триггера на рабочей базе больше ошибки не было.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Теряются записи в таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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