【问题标题】:Adding hash column to table向表中添加哈希列
【发布时间】:2015-11-02 16:19:57
【问题描述】:

我正在尝试使用 SHA256 对某些表的列进行哈希处理并存储哈希值。我正在考虑使用HASHBYTES 来实现这一点,但该函数只能将一个字符串参数作为哈希输入-HASHBYTES('SHA2_256', COLUMN_1)。是否可以散列多个列(包括不是字符串的列)?

我想要这样做的原因是,我可以使用哈希值识别已更改或添加的行,以便稍后在 ETL 过程中使用。我要散列的表之一包含以下列:

[CompanyCode] [varchar](4) NULL,
[CompanyNumber] [int] NULL,
[CompanyDescription] [varchar](20) NULL,
[CompanyAddress] [varchar](60) NULL,
[EffectiveDate] [date] NULL

请注意,由于该表是由第三方管理的,因此我无法使用触发器添加时间戳。

【问题讨论】:

  • 为什么不用时间戳。 (触发器!!!)
  • 对不起,我应该澄清一下表格是由第三方应用程序控制的,我不能修改它。我刚刚复制了一份我正在处理的内容。
  • 不能修改是什么意思?您是说要添加一个新列还是要创建一个新表来保存 hashbytes 值?
  • 除非安全是一个大问题,否则你不能只使用checksum(*) 的版本吗?
  • 您可以将列连接在一起或使用checksum()

标签: sql sql-server hash


【解决方案1】:

我认为将列连接在一起是您最好的选择,您可能希望使用一些隐蔽的语句来使所有内容都采用相同的格式。

SELECT CompanyCode + CONVERT(VARCHAR(50),CompanyNumber) + CompanyDescription + CompanyAddress
+ CONVERT(VARCHAR(50), EffectiveDate)
FROM your_table

这将为您提供您想要的所有信息作为单个字符串。我认为当您想对表进行哈希处理时,您可以使用查询代替哈希函数中的库名:

HASHBYTES('SHA2_256',<above query>)

在 HAHBYTES 前面放置一个 SELECT 以测试并确保它有效。我必须使用 SHA1 进行测试,但让它工作。

SELECT HASHBYTES('SHA2_256','<above query>')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 2021-11-20
    • 2013-12-21
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多