Есть база 1С, работает на Postgres SQL. Сделали выгрузку в файл *.dt. а вот загрузить обратно не получатся, выходит ошибка:
Data uniqueness condition is violated.
An attempt to insert a non-unique value to unique index:
23505: ERROR: duplicate key value violates unique constraint "params_pkey"
DETAIL: Key (filename, partno)=(ibparams.inf, 0) already exists.
CONTEXT: COPY params, line 18
В этой статье расскажу по этапам, как удалось ее победить.
🔥 Для начала важное замечание!
Перед выполнением любых действий на рабочей базе сделайте резервную копию.
Если бэкап не выполняется стандартными способами, то обязательно скопируйте полностью каталог "DATA".
Я буду рассматривать решение вопроса на PostgresSQL for Windows. Каталог data по умолчанию расположен по такому пути: "C:\Program Files\PostgreSQL\11.14-2.1C\data"
🔴 Что произошло?
Есть база 1С, которая работает на Postgres, ее нужно было перенести в облачный сервис, сделали стандартную выгрузку в файл *.dt, но при загрузке все падало в ошибку, попытался решить проблему следующими способами:
- Тестирование базы средствами СУБД;
- Тестирование и исправление средствами 1С. Это помогло, но как решение у клиента не устраивало, так как тестирование занимает очень большое время и мы не укладывались в технологическое окно;
- Пробовал загрузить в MS SQL, но выходила аналогичная ошибка;
Нарушено условие уникальности данных.
Попытка вставки неуникального значения в уникальный индекс.
Microsoft OLE DB Driver for SQL Server: Выполнение инструкции CREATE UNIQUE INDEX прервано, поскольку обнаружен повторяющийся ключ для объекта с именем "dbo.Params" и индекса с именем "PK__Params__3F5D91860BEA8D59". Повторяющееся значение ключа: (log.inf, 0).
HRESULT=80040E2F, HRESULT=80040E2F, SQLSrvr: SQLSTATE=42000, state=1, Seventy=10, native=1750, line=1
SQLSvr: SQLSTATE=23000, state=1, Seventy=10, native=1505, line=1
🟢 Решение проблемы!
1. Надо найти эти проблемные записи и попробовать с ними что-то сделать.
Для начала зайдем в консоль psql. Откроем Командную строку (cmd.exe) и введем команду: 'psql -U postgres -d UT_1C', где postgres - имя пользователя СУБД, UT_1C имя нашей базы. После ввода нужно будет ввести пароль пользователя postgres.
2. Посмотрим на нашу ошибку:
23505: ERROR: duplicate key value violates unique constraint "params_pkey" DETAIL: Key (filename, partno)=(ibparams.inf, 0) already exists. CONTEXT: COPY params, line 18
В тексте ошибки есть информация в какой таблице у нас проблема, это params, а так же какие ключевые поля у нас дублируются — (filename, partno). Значения, которые совпадают это (ibparams.inf, 0).
Выберем записи по полям из ошибки — (filename, partno).
Выполним запрос: ‘select (filename, partno) from params;’
При детальном изучении видно, что на самом деле в этой таблице есть дубль не по одному значению, а по двум:
- (ibparams.inf, 0)
- (log.inf, 0)
3. Посмотрим детально на эти записи. Отберем по полю filename
Выполним запрос: ‘select * from params where filename='ibparams.inf';’
4. Да, в одной таблице две записи c одинаковыми ключами. Что там хранится конечно не поймешь, но давайте попробуем удалить вторую запись, она по времени была позже.
Выполним запрос: 'delete from params where filename='ibparams.inf' and partno=0 and datasize=206;'. В запросе я делаю отбор по полям filename, partno, datasize.
Запись удалена:
Проверяем, выполняем запрос: ‘select * from params where filename='ibparams.inf';’
Отлично, осталась одна запись.
Повторяем действия с п.3 для значения (log.inf, 0).
5. После удаления записей делаем выгрузку в *.dt и пробуем загрузить.
Ошибка ушла, загрузка прошла успешно!