【问题标题】:How to compare hash of two table columns hashes across SQL Server and Postgres?如何比较 SQL Server 和 Postgres 中两个表列的哈希值?
【发布时间】:2019-11-05 10:17:52
【问题描述】:

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

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

我可以尝试将列读入 SQL serverPostgres 中的 Numpy 系列 项,然后比较两者。

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

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

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

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

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

谁能指点我的方向。

【问题讨论】:

  • @@Sukumar Rdjf 我认为...您必须使用 SQL Delta...比较数据库...
  • 似乎不支持比较 SQL ServerPostgres
  • 将两个表下载为 CSV 文件并使用 windiff 进行比较
  • 由于network constraintsVPN restrictionsssh tunneling,将表格下载到我的本地需要很长时间。我认为这是不可能的。

标签: python sql-server database postgresql hash


【解决方案1】:

如果 FDW 不适合您,也许哈希比较是个好主意。 MD5 可能是个好主意,只是因为您应该从不同的软件中获得一致的结果。

显然,您需要列在两个数据库中的顺序相同才能进行哈希比较。如果布局不同,您可以在 Postgres 中创建一个视图以匹配 SQL Server 中的列顺序。

一旦你有了要比较的表/视图,Postgres 端就有一个散列的捷径。想象一个名为facility的表:

SELECT MD5(facility::text) FROM facility;

如果这不明显,这就是其中的内容。 Postgres 能够将 any 复合类型转换为文本。喜欢:

select your_table_here::text from your_table_here

结果就像这个例子:

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

注意结果周围的(括号)。在 SQL Server 端生成哈希时,您需要考虑到这一点。这段简洁的代码去掉了括号:

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

或者,您可以手动将列连接为字符串,然后对其进行哈希处理。如果您的 ID 或时间戳字段在导入期间自动更改,您可能需要这样做,或者使用视图。

:: 转换运算符还可以将行转换为另一种类型,前提是您已经进行了转换。在我上面列出的表格中,您也可以使用视图。

在 SQL Server 方面,我不知道。 HASHBYTES?

【讨论】:

  • 我在 Postgres 上尝试了 md5 函数,它工作正常。唯一的问题是我不确定如何在 SQL Server 上做同样的事情
  • 是的。我就是这么看的。但是他们为单个专栏提供了信息教程。虽然这是我之前想要的,但我想比较表的整行的哈希值而不是单个列的哈希值会好得多。我可以通过* 代替链接中的c1 列吗?
  • 我还建议您提取 PK 行哈希进行比较。如果你在本地下载它们,你可以将它们加载到一个临时数据库中,并且很容易找到不匹配的地方。 PK 将比依靠行顺序更清楚地为我们工作。如果缺少一行,使用行顺序的整个想法就是吐司。我已经做过这种事情来验证数百万行同步,并且效果很好。但这只是因为我有PK要加入。另外,然后我可以获取我的 200 个问题 ID,并在 6M 行中找到它们以弄清楚发生了什么。试图按行顺序来做......呃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2021-07-19
相关资源
最近更新 更多