Как сравнить хэш двух хэшей столбцов таблицы в SQL Server и Postgres? - PullRequest
1 голос
/ 05 ноября 2019

У меня есть таблица в SQL Server 2017 , в которой много строк, и эта таблица была перенесена в Postgres 10,5 вместе с данными ( мои коллеги сделали это с помощью инструмента Talend ).

Я хочу сравнить, правильны ли данные после миграции. Я хочу сравнить значения в столбце в SQL Server против Postgres .

Я мог бы попробовать прочитать столбцы в ряд Numpy элементовс SQL-сервер и Postgres и сравните оба.

Но обе БД находятся не на моей локальной машине. Они размещены на сервере, к которому мне нужен доступ из сети, что означает, что получение данных займет много времени.

Вместо этого я хочу сделать что-то вроде этого.

Выполнить sha256 или md5 хэш для значений столбцов order_by primary_key и сравнение значений хеш-функций из обеих баз данных, что означает, что мне не нужно извлекать результаты избаза данных в мой местный для сравнения.

Эта функция или что-то должно возвращать то же значение для хеша , если столбец имеет точно такие же значения.

Я даже не уверен, возможно ли это или естьлюбой лучший способ сделать это.

Может кто-нибудь, пожалуйста, укажите мне в каком-то направлении.

1 Ответ

1 голос
/ 06 ноября 2019

Если FDW не сработает для вас, возможно, сравнение хешей - хорошая идея. MD5, вероятно, хорошая идея, только потому, что вы должны получать согласованные результаты из разных программ.

Очевидно, что столбцы должны быть в одном и том же порядке в двух базах данных длясравнение хэша с работой. Если макеты отличаются, вы можете создать представление в Postgres, чтобы оно соответствовало порядку столбцов в SQL Server.

После того, как вы сравните таблицы / представления, появится ярлык для хеширования на стороне Postgres. Представьте себе таблицу с именем facility:

SELECT MD5(facility::text) FROM facility;

Если это не очевидно, вот что там происходит. Postgres имеет возможность любой составной тип к тексту. Как:

select your_table_here::text from your_table_here

Результат похож на этот пример:

(2be4026d-be29-aa4a-a536-de1d7124d92d,2200d1da-73e7-419c-9e4c-efe020834e6f,"Powder Blue",Central,f)

Обратите внимание на (parens) вокруг результата. Это необходимо учитывать при создании хэша на стороне SQL Server. Этот содержательный фрагмент кода лишает паренов:

SELECT MD5(substring(facility::text, 2, length(facility::text))) FROM facility;

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

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

На стороне SQL Server я понятия не имею. HASHBYTES

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...