30

有没有办法对 SQL 表中的一行进行 md5sum 以检查是否有任何列已被修改?

我想检查是否有任何特定列已更改与我保存在文本文件中的旧数据副本(我将在 C# 中 md5sum)。

编辑:只需 md5sum-ing 每一行

4

4 回答 4

30

CHECKSUM(*),BINARY_CHECKSUM(*)CHECKSUM_AGG. 他们像 checkum 一样执行 CRC32,但对于检测一行的更改来说,它应该绰绰有余(你说的是 40 亿分之一的假阴性碰撞机会)。

使用加密散列HASHBYTES需要您构造一个表示“行”的表达式。

于 2012-06-25T09:01:28.200 回答
16

如果您有 SQL Server 2008 或更高版本,您可以使用:

SELECT HASHBYTES('SHA1', (SELECT TOP 1 * FROM dbo.Table FOR XML RAW))

或者

SELECT  
    HASHBYTES('SHA1',(
        SELECT  * 
        FROM    dbo.myTable as  tableToHash 
        where   tableToHash.myUniqueKey=myTable.myUniqueKey 
        FOR XML RAW
    ))                                              as  rowSHA1
from    dbo.myTable;
于 2016-08-03T13:51:42.390 回答
3

我必须开发一个解决方案来比较表结构并运行一个程序来导入表之间的差异。

我使用下面的代码来选择数据

--> 表结构

create table #table1 (
campo varchar(10)
,campo1 varchar(10)
)

create table #table2 (
campo varchar(10)
,campo1 varchar(10)
)

--> 插入值

insert into #table1 values ('bruno',1)
insert into #table1 values ('bruno',2)
insert into #table2 values ('bruno',1)
insert into #table2 values ('bruna',2)

--> 创建一个哈希列进行比较

select *,HASHBYTES('SHA1', (select z.* FOR XML RAW)) as hash
    into #compare1
 from #table1 z 

select *,HASHBYTES('SHA1', (select k.* FOR XML RAW)) as hash
    into #compare2
 from #table2 k 

--> 检查有什么不同的行

select * from  #compare1 a
full outer join #compare2 b on a.hash = b.hash
where ( a.hash is null or b.hash is null )

也许这对需要相同东西的人有用在这里查找上面解释的代码

于 2019-02-20T15:22:41.623 回答
1

获取所有行,对每一列做md5,并与之前数据中对应列的md5进行比较。

于 2012-06-25T08:59:26.440 回答