我们可以使用校验和来检查行是否已更改(sql server)?

时间:2014-04-25 03:52:27

标签: sql sql-server sql-server-2008 tsql

Create table Info
(
Personid int,
PersonNo int
)

insert into Info(Personid,PersonNo) values(3,4)

这里我们可以看到特定行的校验和值

Select CHECKSUM(Personid ,PersonNo ) from Info

现在我更新PersonNo的值并检查特定行的校验和

CheckSum值已更改

因此,我可以知道特定行已被更改

所以我的问题是,这是安全还是准确?

2 个答案:

答案 0 :(得分:3)

这不安全,CHECKSUM可能会为不同的数据产生重复。

在SQL Server中,要检查行之间是否已更改,通常会使用ROWVERSION(或它的synonim TIMESTAMP),但您必须将其作为列添加到表中。这不是一个真正的时间戳,而只是一个数据库范围的计数器,并为每个更新的行自动维护。请注意,当发出UPDATE语句时,它将发生更改,内容实际上可能保持不变,而不是校验和。

或者您可以滚动自己的实时时间戳 - 添加所需精度的日期时间列并手动更新。

答案 1 :(得分:2)

来自CHECKSUM (Transact-SQL)

  

CHECKSUM满足散列函数的属性:应用了CHECKSUM   在任何两个表达式列表中返回相同的值,如果   两个列表的相应元素具有相同的类型   使用equals(=)运算符进行比较时相等。为了这   定义,指定类型的空值被认为是比较   平等的。 如果表达式列表中的某个值发生更改,则   列表的校验和通常也会发生变化。

请注意

  

但是,校验和不会发生变化的可能性很小。因此,我们不建议使用CHECKSUM来检测是否   值已发生变化,除非您的应用程序偶尔可以容忍   错过了一个变化。请考虑使用HashBytes。   当指定MD5哈希算法时,HashBytes的概率   为两个不同的输入返回相同的结果远低于   CHECKSUM的那个。