Create table Info
(
Personid int,
PersonNo int
)
insert into Info(Personid,PersonNo) values(3,4)
这里我们可以看到特定行的校验和值
Select CHECKSUM(Personid ,PersonNo ) from Info
现在我更新PersonNo的值并检查特定行的校验和
CheckSum值已更改
因此,我可以知道特定行已被更改
所以我的问题是,这是安全还是准确?
答案 0 :(得分:3)
这不安全,CHECKSUM
可能会为不同的数据产生重复。
在SQL Server中,要检查行之间是否已更改,通常会使用ROWVERSION
(或它的synonim TIMESTAMP
),但您必须将其作为列添加到表中。这不是一个真正的时间戳,而只是一个数据库范围的计数器,并为每个更新的行自动维护。请注意,当发出UPDATE语句时,它将发生更改,内容实际上可能保持不变,而不是校验和。
或者您可以滚动自己的实时时间戳 - 添加所需精度的日期时间列并手动更新。
答案 1 :(得分:2)
CHECKSUM满足散列函数的属性:应用了CHECKSUM 在任何两个表达式列表中返回相同的值,如果 两个列表的相应元素具有相同的类型 使用equals(=)运算符进行比较时相等。为了这 定义,指定类型的空值被认为是比较 平等的。 如果表达式列表中的某个值发生更改,则 列表的校验和通常也会发生变化。
请注意
但是,校验和不会发生变化的可能性很小。因此,我们不建议使用CHECKSUM来检测是否 值已发生变化,除非您的应用程序偶尔可以容忍 错过了一个变化。请考虑使用HashBytes。 当指定MD5哈希算法时,HashBytes的概率 为两个不同的输入返回相同的结果远低于 CHECKSUM的那个。