Показать сообщение отдельно
Старый 17.07.2008, 14:39   #1  
FliN is offline
FliN
Участник
 
2 / 10 (1) +
Регистрация: 24.12.2007
Постановка задачи.

В результате работы отчета по репликации данных между двумя NAVI базами данных произошел сбой и часть данных попала из одной в другую, часть нет. Для продолжения работы необходимо произвести синхронизации данных.
Дело осложняется наличием ряда таблиц реплицирующихся по флагу модификации, а также возможностью удаления строк из таблиц.



Решение.

Для сравнения данных между двумя базами системы NAVISION использование стандартных средств системы не достаточно. Поскольку отчет по проверке баз в «лоб» работает крайне медленно и при значительном размере баз займет вечность.

С другой стороны использование каких-то внешних инструментов не только затруднено необходимостью наличия лицензии (и не возможности её установки у клиента), но тем что сами эти инструменты внешние по отношению к системе.

Использование Dataport-ов отчасти способно решить проблему, но только в случае если надеться разделитель для столбцов, и если у вас есть изрядная выдержка для проверки всего этого ясным взором.

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


Результатом может стать действительно головная боль на несколько дней.


Лекарством от мигрени может стать некий взгляд со стороны, а именно со стороны MS SQL. Конечно, для этого понадобиться некоторое количество программных средств и понимания ситуации и причины её возникновения, но это проще вглядывание в километры текстовых файлов.



Рецепт на удивление прост – MS SQL, ApexSQL Diff и терпение.

Первое, конечно копии базы данных – куда без них.

Второе, необходимо позаботиться о датах (как минимум, в идеале необходимо вообще проверить форматы – но это может и не понадобиться). Именно даты могут нам помешать, поскольку MS SQL понимает их только в диапазоне 01.01.1753..31.12.9999, а NAVI начиная с 01.01.0000.
Их можно править руками, а можно и с помощью отчета.

Третье, удаляем все не нужные таблицы – простого DELETEALL достаточно. Лучшим решением служит написание отчета в txt после чего его компиляция.

Четвертое, удаление всех не нужных ключей из наших таблиц – не зачем нам выстраивание их на MS SQL сервере.

Пятое, физическое удаление таблиц – а то тащить их на SQL сервер занятье глупое (найти как программно удалить таблицы из базы данных мне не удалось)

Шестое, BackUp и его разворачивание на MS SQL сервере. Если все нормально то мы готовы к проверке, но чаще всего точно возникнет ошибка и процесс придется повторить – пока не избавимся от всех неверных дат, ключей и т.п.
! Не стоит забывать что у нас две базы, а поэтому тоже нужно сделать для них обоих.

Седьмое, Используя ApexSQL Diff произвести сравнение.

Восьмое, найденные ApexSQL Diff расхождения реплицировать между базами данных.

<правка не завершена>