下面的过程sp_MSdel、sp_MSins、sp_MSupd是Server上配置的发布/订阅的结果。
这些过程允许您在其中进行小的转换,这样流数据就可以以不同的模式传输或到达目的地。
例如,有一个名为"Data“的表的发布,其中包含两列到发布服务器中:
CREATE TABLE [dbo].[Data](
[id] [int] NOT NULL,
[description] [nchar](10) NULL,
CONSTRAINT [PK_Dasta] PRIMARY KEY CLUSTERED ([id] ASC) ON [PRIMARY]
)对于一个名为"Data“的表,我可以有一个稍微不同的结构,它有三列进入订阅服务器:
CREATE TABLE [dbo].[Data](
[tenant_id] NOT NULL,
[id] [int] NOT NULL,
[description] [nchar](10) NULL,
CONSTRAINT [PK_Dasta] PRIMARY KEY CLUSTERED ([tenant_id] ASC, [id] ASC) ON [PRIMARY]
)在此过程中,我还可以修改复制过程dbo.服务提供商_MSins_dboData,以在新的目标列tenant_id中添加逻辑。
ALTER procedure [dbo].[sp_MSins_dboData]
@c1 int,
@c2 nchar(10)
as
begin
insert into [dbo].[Data] (
[tenant_id],
[id],
[description],
) values (
1,
@c1,
@c2)现在,在有多个发布者指向相同订阅的情况下,是否可以传递一个原始参数(因此,而不是硬编码的参数使其可变),以确保流数据的来源?
我认为最简单的解决方案是为每个源数据库创建不同的过程,如sp_MSins_dboData_1、sp_MSins_dboData_2等,但我正在考虑更动态的方法。
有什么想法吗?
发布于 2022-11-23 13:36:41
现在,在一个有多个发布者指向相同订阅的场景中
我认为这意味着您将从多个源表发布到单个订阅服务器表。这是不建议的,而且容易出错。
相反,将每个发布复制到不同的表,甚至模式以获得更好的可管理性,并使用视图(或其他一些机制)来统一数据。请看这个相关DBA.StackExchange答案暗示着同样的。
下面的过程sp_MSdel、sp_MSins、sp_MSupd是Server上配置的发布/订阅的结果。这些程序让你在里面做一些小的转换.
不,请你也不要那样做。这些是复制为出版物中的每个项目生成的本机过程。直接改变这些情况也容易出错,而且管理不善。
相反,当您在语句传递部分的项目属性下将项目添加到复制时,您可以为INSERT、UPDATE、DELETE进程指定自己的存储过程:

不幸的是,我认为您无法在这里指定参数(尽管我自己还没有尝试)。但是,如果您注意我关于不将多个发布服务器表复制到同一个订阅服务器表的建议,则这将不再适用。
发布于 2022-11-24 11:42:58
我设法做到了演示的目的,所以我不知道这将如何表现为大型项目,如在其他答案提到。
我所做的是:
我注意到的一件事是,您不能在使用此配置时启动快照,因为目标具有不同的模式,但是发布中的Snap快照页下有一些选项可以在应用快照之前和之后应用脚本。
https://dba.stackexchange.com/questions/320113
复制相似问题