Добавлены строки с призрачными данными в таблицу базы данных Firebird? - PullRequest
0 голосов
/ 19 октября 2018

Сегодня я столкнулся со странным случаем при получении базы данных клиентов для расследования.

Системные настройки:

  • Сервер Firebird v 2.5.9.26074
  • Клиент Firebird v 2.6.5
  • Файл базы данных доступен непосредственно из приложеният.е. он НЕ зарегистрирован через aliases.conf.

Когда я впервые заглянул в базу данных, все выглядело довольно согласованно.Однако во время первого запуска в определенную таблицу добавляются две строки без какого-либо обнаруженного выполнения SQL.Я подтвердил отладчиком, что приложение не добавляет эти строки.Я также использовал интерфейс Audit и Trace (fbtracemgr) и увидел в файле журнала, что в базу данных не добавляются такие строки.

Есть один намек на то, что что-то не так в исходной базе данных.В таблице, содержащей проблему, используется триггер INSERT для установки значения столбца идентификатора строки таблицы из генератора.Теперь значение генератора кажется слишком высоким в исходной базе данных.Это заставляет меня думать, что «данные-призраки» уже были введены в файл в каком-то кеше, поскольку генератор уже увеличивается на единицу.

В результате после добавления двух строк-призраковследующее реальное добавление к таблице приводит к исключению:

 FirebirdSql.Data.FirebirdClient.FbException (0x80004005): violation of 
 PRIMARY or UNIQUE KEY constraint "INTEG_275" on table "DATALOG" ---> 
 violation of PRIMARY or UNIQUE KEY constraint "INTEG_275" on table 
 "DATALOG"

, поскольку уже существует строка с равным идентификатором, которую предлагает генератор.

Существует ли постоянный «несохраненный кэш данных», который мог бысодержать данные строки, введенные во время предыдущих запусков приложения?Что может привести к этой ситуации?Отключение питания при записи или резервном копировании базы данных?

Есть мысли?

1 Ответ

0 голосов
/ 19 октября 2018

Сервер Firebird v 2.5.9.26074

Такой версии не выпущено.

Firebird-2.5.8.27089 http://www.firebirdsql.org/en/firebird-2-5/

В основном вы, кажется, используете внутреннюю сборку некоторых дестабилизированных разработчиков FB, которая может иметь любое количество странных нежелательных эффектов.

Поэтому я бы посоветовал использовать стандартную выпущенную версию или если для некоторых требуется сборка снимковНеисчислимые причины - спросить разработчиков в списке рассылки поддержки Firebird - http://www.firebirdsql.org/en/support/

Хотя вы не затаили дыхание из-за большой поддержки экзотических сборок Firebird.

UPD.Благодаря Марку, вот оно: https://www.firebirdsql.org/en/firebird-2-5-0/

2.5.0 - был первый выпуск после значительной переделки двигателя.Не самая стабильная, очевидно.Например, была проблема с индексами прямо в следующей версии 2.5.1.


, если поведение будет повторяться на стандартном 2.5.8 Firebird, тогда я бы предложил экспортировать всю базу данных (по крайней мере,все метаданные, но, может быть, и данные) в длинный текстовый файл, сценарий SQL, а затем поиск в нем указанного имени таблицы.Например, при подключении к базе данных могут быть добавлены некоторые данные.Или хранимые процедуры.Или взгляды на триггеры.Или что-то еще.Например, несмотря на злоупотребление служебным положением, даже функция UDF может создать собственное соединение с базой данных и что-то делать, хотя это должно быть показано в FBTrace.


Однако при первом запуске добавляются две строкив определенной таблице

при запуске чего?

будут ли эти строки еще добавляться, если вы используете стандартные инструменты, такие как iSQL / FlameRobin / IBExpert / etc, просто для подключения, а затем отсоединения от базы данных?


, поскольку уже существует строка с равным идентификатором, которую генератор предлагает

Генератор не может предлагать подобные вещи.Можно только предположить, что когда-то такой номер был зарезервирован для возможного добавления в ту или иную таблицу.Это не означает, что строка была фактически вставлена, вставлена ​​в эту таблицу, позже не была удалена.

Вы можете попытаться выполнить поиск с запрещенными индексами, в случае возможного повреждения индекса, например,

  select id+0, count(*) from tableName group by 1

Также http://www.firebirdfaq.org/faq324/


при получении базы данных клиентов для расследования

Кстати, как именно они создали копию базы данных, чтобы дать вам?Они сделали резервную копию (ФБК)?Если нет, остановили ли они сервер Firebird перед копированием?

...