在服务器之间复制具有特定复制要求的多个服务器

时间:2011-02-25 22:43:21

标签: .net sql-server conditional database-replication

考虑两个表AB,如下所示(让我为丑陋的ASCII表道歉):

----------------------------------     ------------------------
|  SNID  |  PNID  | SerialNumber |     |  PNID  |  PartNumber |
|--------|--------|--------------|     |--------|-------------|
|   0    |   0    |   17823      |     |   0    |  9874-4362  |
|--------|--------|--------------|     |--------|-------------|
|   1    |   0    |   17824      |     |   1    |  1053-1409  |
|--------|--------|--------------|     ------------------------
|   2    |   1    |   97245      |
----------------------------------

我希望位置α的服务器能够拥有PNID 0的特定权限,而位置β的服务器可以拥有PNID 1的特定访问权限,但因为它是相同的数据类型(只是不同的所有者),我不认为数据本身应该是分开的。

在任何情况下,我都想确定β是否想要为PNID 0分配一个序列号,它必须首先与α通信才能允许这样做。这意味着如果它们之间的网络发生故障,那么α可以产生PNID 0但不能产生PNID 1,β可以产生PNID 1而不产生PNID 0。然而,当两个实体重新进行通信时,为PNID 0创建的α的任何序列号将被复制到β,而关于PNID 1的β的序列号将合并到α的数据库中。

更一般地说,我更倾向于设置一个'中间人'位置Ω,它做出了关于α是否能够在没有β许可的情况下添加新序列号的所有决定。

我目前正在使用SQL Server Express(2008 r2)以及Visual Basic .NET Express(2010)来实现服务器,但我可以使用任何其他选项来解决我目前遇到的问题。老实说,我并不认为我所要求的是合情合理的,但如果是这样的话,我真的对实施非常感兴趣。

几乎立即,我能想到的第一件事就是在代表位置的表B中添加另一列,但我不认为这是“正确”的方法。特别是关于与其他服务器进行通信的部分(说实话,我甚至不知道我是否可以使用数据库做到这一点,因此可能必须我想在.NET中完成。

1 个答案:

答案 0 :(得分:2)

您是否考虑为α创建视图

select * from A where PNID0=0
select * from B where PNID0=0

并为β

创建视图
select * from A where PNID0=1
select * from B where PNID0=1

然后,您可以为不同位置的这些视图授予权限,而不是创建另一个Ω位置。