当前位置:Gxlcms > 数据库问题 > SQL Server 中心订阅模型(多发布单订阅)

SQL Server 中心订阅模型(多发布单订阅)

时间:2021-07-01 10:21:17 帮助过:42人阅读

默认情况下,表结构如下:

CREATE TABLE [dbo].[DemoTab](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[name] [varchar](10) NOT NULL,
	[value] [decimal](18, 4) NULL,
	CONSTRAINT [PK_DemoTab] PRIMARY KEY CLUSTERED ([id] ASC)
)
GO

如果这样,id 自增量肯定有重复键,因此增加一个标志列 [LocationID],并如 id 列作为组合键。如下,分别在两个发布数据表中创建表。

--数据库:[TestDBSubA]
USE [TestDBSubA]
GO
CREATE TABLE [dbo].[DemoTab](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[name] [varchar](10) NOT NULL,
	[value] [decimal](18, 4) NULL,
	[LocationID] INT NOT NULL DEFAULT(1)
	CONSTRAINT [PK_DemoTab] PRIMARY KEY CLUSTERED ([id] ASC,[LocationID] ASC)
)
GO

--数据库:[TestDBSubB]
USE [TestDBSubB]
GO
CREATE TABLE [dbo].[DemoTab](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[name] [varchar](10) NOT NULL,
	[value] [decimal](18, 4) NULL,
	[LocationID] INT NOT NULL DEFAULT(2)
	CONSTRAINT [PK_DemoTab] PRIMARY KEY CLUSTERED ([id] ASC,[LocationID] ASC)
)
GO

此时就可以使用字段 [LocationID] 来确定是不同数据库的数据了,在同一个订阅表中就不会有主键重复问题了。但是当在其中一个发布初始化时,或者操作数据时,怎么区分来自不同的发布数据库的数据呢?接下来设置静态行筛选器,非常重要!


【设置静态行筛选器】

此时可以在 数据库 [TestDBSubA] 或 [TestDBSubB] 的服务器中创建发布了,使用的是事务复制,选择需要发布的表,如下图:

技术分享图片

下一步,设置行筛选器,筛选条件为 [LocationID]=1(这个是数据库 [TestDBSubA] 的发布),同理设置 [TestDBSubB] 的发布!

技术分享图片

技术分享图片


接下来一步步完成即可。还有一步重要的设置,发布表对象的属性。其实在上一步在操作中也可以设置。


【设置表项目的应用属性】

右键刚创建完成的发布,选择属性,选择项目,可以选择设置一个表或者所有表。如图:

技术分享图片


选择设置所有表,设置属性 “名称已被使用时的操作”为 “删除数据,如果目标有行筛选器,仅删除与该筛选器匹配的数据(Delete data,If article has a row filter, delete only data that matches the filter)

技术分享图片

设置完成后确定推出!

同理设置 [TestDBSubB] 的发布!(注意 [LocationID] = 2)


订阅正常设置,两个发布的订阅都是同一个数据库。

技术分享图片

先后分别初始化应用快照,正常!

技术分享图片



现在测试,分别在两发布数据库中插入数据。

INSERT INTO [TestDBSubA].[dbo].[DemoTab]([name],[value]) SELECT 'TestDBSubA',0
INSERT INTO [TestDBSubB].[dbo].[DemoTab]([name],[value]) SELECT 'TestDBSubB',0

SELECT * FROM [TestDB].[dbo].[DemoTab]
技术分享图片

结果合并了!!所有DML操作正常同步!数据可以正常操作同步,但是字段增删改则有问题!!



SQL Server 中心订阅模型(多发布单订阅)

标签:tab   完成   筛选条件   alt   filter   不同   下一步   sdn   字段   

人气教程排行