Утилита для переноса данных ЛЭРС УЧЁТ с SQL Server в БД Postgres

Утилита предназначена для переноса данных ЛЭРС УЧЁТ из БД SQL Server в чистую базу данных Postgres. В базе не должно быть созданных объектов, иначе, перенос завершится с ошибкой.

Загрузить

Внимание!

В зависимости от размера исходной базы данных, перенос может выполняться несколько часов!

Ограничения

Утилита не импортирует абсолютно все настройки. В настоящее время после импорта в базу Postgres будут отсутствовать:

  • Точки учёта для копирования Тнв в справочник территории

Инструкция

Подготовка

Предполагается, что у вас уже есть компьютер, на котором работает ЛЭРС УЧЁТ, подключенный к базе данных SQL Server. На этом компьютере нужно остановить службу ЛЭРС УЧЁТ - Сервер, чтобы БД не менялась во время работы утилиты.

После остановки службы на этом же компьютере

Сначала установите ЛЭРС УЧЁТ с базой данных Postgres. После установки остановите службу ЛЭРС УЧЁТ - Сервер.

На этом же компьютере откройте файл c:\Program Files\LERS\Server\Lers.Server.xml и скопируйте строку подключения к SQL Server из секции connectionString. Эту строку нужно сохранить, так как она нужна для запуска утилиты.

Теперь на новом компьютере установите ЛЭРС УЧЁТ, выбрав базу данных “Postgres”. После успешной установки, остановите службу ЛЭРС УЧЁТ - Сервер и скопируйте из Lers.Server.xml строку подключения к БД Postgres.

В итоге у вас должно получиться:

  1. База данных LERS на SQL Server и строка подключения из исходного сервера.
  2. Пустая база данных LERS на Postgres и строка подключения из нового сервера.

Запуск переноса

  1. Скачайте утилиту.
  2. Распакуйте архив в любую папку на компьютере, который имеет доступ к обоим серверам БД. Утилита должна подключиться и к БД SQL Server и к Postgres. Например, это будет папка c:\sqls2pg.
  3. Откройте командную строку cmd.exe
  4. Выполните команду cd c:\sqls2pg.
  5. Выполните команду Lers.Sqls2Pg.exe db --source-connection "СТРОКА_ПОДКЛЮЧЕНИЯ_К_SQL_SERVER" --target-connection "СТРОКА_ПОДКЛЮЧЕНИЯ_К_POSTGRES".

Утилита переносит все таблицы, кроме Документов и готовых отчётов.
Если вам нужно перенести и эти файлы, перед запуском утилиты удалите в файле config.json все таблицы из секции IgnoreTables кроме dtproperties.

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

       Обрабатывается таблица SystemParameters (56 из 185) ---------------------------------------- 100%

Npgsql.PostgresException: 23503: insert or update on table “Territory” violates foreign key constraint “FK_Territory_MeasurePoint_CopyMeasurePointId”

DETAIL: Detail redacted as it may contain sensitive data. Specify ‘Include Error Detail’ in the connection string to include this information.
at async ValueTask Npgsql.Internal.NpgsqlConnector.g__ReadMessageLong|211_0(NpgsqlConnector connector, bool async, DataRowLoadingMode dataRowLoadingMode, bool readingNotifications, bool isReadingPrependedMessage)
at async Task Npgsql.NpgsqlDataReader.NextResult(bool async, bool isConsuming, CancellationToken cancellationToken)
at async ValueTask Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, bool async, CancellationToken cancellationToken)
at async ValueTask Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, bool async, CancellationToken cancellationToken)
at async Task Npgsql.NpgsqlCommand.ExecuteNonQuery(bool async, CancellationToken cancellationToken)
at void Program.<>c__DisplayClass0_3.<<$>b__6>d.MoveNext()
at async Task Lers.Sqls2Pg.PgScriptGenerator.AddTableAsync(string table, IProgress progress)
at void Program.<>c__DisplayClass0_3.<<$>b__7>d.MoveNext()
at void Spectre.Console.Progress.<>c__DisplayClass27_0.<b__0>d.MoveNext() in //src/Spectre.Console/Live/Progress/Progress.cs:98
at void Spectre.Console.Progress.<>c__DisplayClass28_0`1.<b__0>d.MoveNext() in /
/src/Spectre.Console/Live/Progress/Progress.cs:133
at async Task Spectre.Console.Internal.DefaultExclusivityMode.RunAsync(Func<Task> func) in //src/Spectre.Console/Internal/DefaultExclusivityMode.cs:40
at async Task Spectre.Console.Progress.StartAsync(Func<ProgressContext, Task> action) in /
/src/Spectre.Console/Live/Progress/Progress.cs:116
at async Task Spectre.Console.Progress.StartAsync(Func<ProgressContext, Task> action) in /_/src/Spectre.Console/Live/Progress/Progress.cs:96
at void Program.<>c__DisplayClass0_0.<<$>b__1>d.MoveNext()
at async Task<ParserResult> CommandLine.ParserResultExtensions.WithParsedAsync(ParserResult result, Func<T, Task> action)
at async Task Program.$(string[] args)

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

Временно удалили в postgres внешний ключ “FK_Territory_MeasurePoint_CopyMeasurePointId”, будем его восстанавливать снова при успешном завершении переноса всех данных

пока это помогло, спасибо

Думаю, что лучше было бы обнулить колонку CopyMeasurePointId в таблице Territory, чтобы не изменять структуру базы.

Когда будете восстанавливать ключ, сделайте его именно с таким же именем. Иначе в будущем могут быть проблемы при обновлении.

После миграции внешний ключ вернул, все нормально. Единственное что, почему то с базой постгрес перестал принимать данные от приборов. Сейчас снова переключились на ms sql, но тоже не вариант, поскольку близки к предельному заполнению express версии базы.

Попробуйте после выхода 3.47. В ней исправлено множество найденных проблем с БД Postgres.