0

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

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

我的问题是这样的:

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

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

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

干杯,

4

3 回答 3

2

编辑:似乎有问题的表甚至没有 PK 我不会再考虑 BINARY_CHECKSUM 了。

我认为您必须在客户端代码中使用更好的函数(如 SHA256 甚至更高)来计算哈希。

于 2013-01-04T12:43:56.080 回答
2

将此发布在对 Jobo 的回答的评论中:

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其作为保持数据库同步的方法。

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

例外情况是,如果您使用的是足够长的平衡散列函数,那么冲突的可能性很小,以至于您一生都不会看到。int,在 32 位,不够长。

于 2013-01-04T15:44:18.107 回答
0

你甚至不能改变目标数据库?

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

如果 PK 是数据,那么如果 PK 发生更改,您知道发生了更改,但是您将如何知道它映射到哪一行?

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

没有 PK,就没有“使用更改更新数据库 B”。
充其量您可以插入任何不匹配的行。
您不知道它是新行还是编辑行。
对于任何散列,您都有可能发生碰撞而错过一行。
如果您期望每小时同步,希望您没有太多行。

于 2013-01-04T14:59:44.383 回答