如何比较SQL Server和Postgres之间的两个表列哈希



我在SQL Server 2017中有一个表,它有很多行,该表与数据一起迁移到Postgres 10.5(我的同事使用Talend工具(。

我想比较迁移后的数据是否正确。我想比较SQLServerPostgres中一列中的值。

我可以尝试将这些列读取到SQL服务器PostgresNumpy系列项中,并对两者进行比较。

但这两个DB都不在我的本地机器中。它们托管在我需要从网络访问的服务器上,这意味着数据检索将花费大量时间。

相反,我想做这样的事情。

primary_key排序的列值执行sha256md5哈希,并比较两个数据库的哈希值,这意味着我不需要将数据库中的结果检索到本地进行比较。

如果列具有完全相同的值,则该函数或其他函数应为哈希返回相同的值。

我甚至不确定这是否可能,或者是否有更好的方法。

有人能给我指个方向吗。

如果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

最新更新