Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Теряются записи в таблице / 10 сообщений из 10, страница 1 из 1
21.10.2019, 18:11
    #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
21.10.2019, 19:36
    #39879562
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряются записи в таблице
SHS_SHS,

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

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

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

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

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

Появится Влад может ещё чего спросит
...
Рейтинг: 0 / 0
21.10.2019, 21:58
    #39879604
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряются записи в таблице
Симонов ДенисПоявится Влад может ещё чего спроситВопросы всё те же самые
...
Рейтинг: 0 / 0
21.10.2019, 23:17
    #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
22.10.2019, 09:41
    #39879685
SHS_SHS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряются записи в таблице
Посмотрели программу, посмотрели код формы. Если просто менять эту галку, то все отрабатывает (если это можно так назвать) без ошибок. По коду в этой же транзакции может быть добавление, удаление и изменение других записей таблицы адресов. Вот тогда и вываливается ошибка памяти.
...
Рейтинг: 0 / 0
22.10.2019, 10:23
    #39879725
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряются записи в таблице
SHS_SHSЗ.Ы. Так что единственное, что нужно тут исправлять - это кому-то руки...

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


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