使用BINARY_CHECKSUM是保持两个数据库同步的好方法吗?

时间:2013-01-04 12:20:58

标签: c# sql sql-server tsql

我必须使用数据库来跟踪网络上某些事件的实例。我希望能够将我自己的副本保存在其他地方的其他数据库中。

我遇到的问题是与更新保持同步。如果数据库A上的记录发生更改,我希望随后使用更改更新数据库B.很简单,但数据库A没有任何形式的修改时间戳字段,我根本无法更改数据库(甚至没有添加触发器)。我正在编写一个C#应用程序,它将按小时进行同步。 (这是我的要求所接受的,数据不必一直都是新鲜的。)

我的问题是:

如果我使用BINARY_CHECKSUM,我可以将列表保存在其他地方(内存/ XML /等等)的预期值,然后定期检查它是否不同。如果不同,我可以在代码中手动同步行。

这是个好主意吗?是否有与BINARY_CHECKSUM相关的大量开销?有没有更好的方法来检测我无法更改的行的更改?

编辑:我完全了解SQL复制,但我应该提到这两个数据库不在同一个网络上,它们之间的接口是通过C#访问的Web服务完成的。

干杯,

3 个答案:

答案 0 :(得分:2)

编辑:因为看起来有问题的表甚至没有PK我再也不会考虑BINARY_CHECKSUM了。

我认为您必须使用更好的功能来计算散列,例如SHA256甚至更高的客户端代码。

答案 1 :(得分:2)

在对Jobo answer的评论中发表此内容:

declare @t table (
    ColA int not null,
    ColB int not null,
    ID int IDENTITY(1,1) not null primary key
)
insert into @t values (1,0)
select BINARY_CHECKSUM(*) from @t

update @t set ColA = 0,ColB = 16 where ID = 1
select BINARY_CHECKSUM(*) from @t

结果:

-----------
257

-----------
257

所以不,我不建议BINARY_CHECKSUM作为保持数据库同步的手段。

请记住,任何形式的散列都是确定两个输入肯定不同的好方法(如果散列的结果不同),但如果结果相同,则通常必须检查所有特定值确定输入是否真的相同或只是具有相同的哈希值。

例外情况是,如果你使用足够长度的平衡散列函数,碰撞就不太可能在你的生命中看不到。 {32}的int不够长。

答案 2 :(得分:0)

您甚至无法更改目标数据库?

如果任何PK是身份,那么您还需要映射PK。

如果PK是数据,那么如果PK被更改,你知道有一个变化但是你怎么知道它映射到哪一行?

现在在评论中我们发现没有PK和同步来自多个。

没有PK,没有“更新数据库B的变化” 充其量你可以插入任何不匹配的行 您不知道它是新行还是编辑成行 任何哈希都有可能发生碰撞而错过一排 如果你希望每小时同步希望你没有很多行。