首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sp_MSdel<TableName>,sp_MSins<TableName>,sp_MSupd<TableName>的内部参数

sp_MSdel<TableName>,sp_MSins<TableName>,sp_MSupd<TableName>的内部参数
EN

Database Administration用户
提问于 2022-11-23 12:52:59
回答 2查看 43关注 0票数 0

下面的过程sp_MSdel、sp_MSins、sp_MSupd是Server上配置的发布/订阅的结果。

这些过程允许您在其中进行小的转换,这样流数据就可以以不同的模式传输或到达目的地。

例如,有一个名为"Data“的表的发布,其中包含两列到发布服务器中:

代码语言:javascript
复制
CREATE TABLE [dbo].[Data](
    [id] [int] NOT NULL,
    [description] [nchar](10) NULL,
    CONSTRAINT [PK_Dasta] PRIMARY KEY CLUSTERED ([id] ASC) ON [PRIMARY]
 )

对于一个名为"Data“的表,我可以有一个稍微不同的结构,它有三列进入订阅服务器:

代码语言:javascript
复制
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中添加逻辑。

代码语言:javascript
复制
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等,但我正在考虑更动态的方法。

有什么想法吗?

EN

回答 2

Database Administration用户

发布于 2022-11-23 13:36:41

现在,在一个有多个发布者指向相同订阅的场景中

我认为这意味着您将从多个源表发布到单个订阅服务器表。这是不建议的,而且容易出错。

相反,将每个发布复制到不同的表,甚至模式以获得更好的可管理性,并使用视图(或其他一些机制)来统一数据。请看这个相关DBA.StackExchange答案暗示着同样的。

下面的过程sp_MSdel、sp_MSins、sp_MSupd是Server上配置的发布/订阅的结果。这些程序让你在里面做一些小的转换.

不,请你也不要那样做。这些是复制为出版物中的每个项目生成的本机过程。直接改变这些情况也容易出错,而且管理不善。

相反,当您在语句传递部分的项目属性下将项目添加到复制时,您可以为INSERTUPDATEDELETE进程指定自己的存储过程:

不幸的是,我认为您无法在这里指定参数(尽管我自己还没有尝试)。但是,如果您注意我关于不将多个发布服务器表复制到同一个订阅服务器表的建议,则这将不再适用。

票数 1
EN

Database Administration用户

发布于 2022-11-24 11:42:58

我设法做到了演示的目的,所以我不知道这将如何表现为大型项目,如在其他答案提到。

我所做的是:

  • 将“数据”表创建到publisher1数据库(两列)
  • 将“数据”表创建到publisher2数据库(两列)
  • 将“数据”表创建到订阅服务器数据库(三列)
  • 根据原始文件为插入创建两个存储过程(sp_MSins_dboData_1和sp_MSins_dboData_2),以测试插入。
  • 在本文配置中创建发布时,我配置了以下内容:
    • 不要复制任何类似模式、约束等的内容,以避免覆盖目标上的任何内容。
    • 将属性“复制、插入、更新和删除存储过程”设置为“false”,以避免使用默认过程覆盖您的过程。
    • 将属性“INSERT存储过程”设置为procedure_name 'sp_MSins_dboData_1‘,以便对此特定发布使用此自定义过程来处理包含目标逻辑的插入(在本例中为附加列)。
    • 如果使用了名称,则将属性‘操作’设置为“保持现有对象不变”,以避免覆盖表

我注意到的一件事是,您不能在使用此配置时启动快照,因为目标具有不同的模式,但是发布中的Snap快照页下有一些选项可以在应用快照之前和之后应用脚本。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/320113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档