是否可以在不提供整个发布快照的情况下更改 SQL Server 复制筛选器?

Posted

技术标签:

【中文标题】是否可以在不提供整个发布快照的情况下更改 SQL Server 复制筛选器?【英文标题】:It is possible to alter SQL Server replication filter without delivering an entire publication snapshot? 【发布时间】:2011-09-29 21:32:36 【问题描述】:

我经常被要求更改我的公司 SQL Server Transactional Publications 的过滤器,其中包含数百个表和大约 400GB 的行数据。

每次我需要更改过滤器时,我都必须完全重新拍摄整个出版物的快照并将其交付给订阅者,这个过程几乎需要一整天才能完成。

我的问题:是否可以在不提供整个发布快照的情况下更改 SQL Server 复制过滤器?

【问题讨论】:

【参考方案1】:

您必须从发布中删除表(文章)并使用新过滤器重新添加它。诀窍是,如果您在从发布中删除文章之前删除对文章的订阅,则不需要为所有文章提供完整的快照,而只需为单个表(并且它是新过滤器)。

--Drop existing subscription:
EXEC sp_dropsubscription
                @publication='<pub_name',
                @article='<article_name',
                @subscriber='<sub_name',
                @destination_db='<db_name>',
                @ignore_distributor=0

--Drop the article from the publication:
EXEC sp_droparticle
                @publication='<pub_name',
                @article='<article_name',
                @ignore_distributor=0,
                @force_invalidate_snapshot=1

现在,将文章添加回订阅的最简单方法是通过复制发布 GUI, 您可以添加文章,添加过滤器,然后单击确定。当您运行快照作业时,它只会为单个表生成快照。这称为迷你快照。

如果您想手动将文章及其过滤器重新添加到发布中,则需要执行以下操作以将其重新添加到订阅中。

--Re-add the subscription to the article.
EXEC sp_addsubscription
                @publication = @publication='<pub_name',
                @article = @article='<article_name',
                @subscriber =  @subscriber='<sub_name',
                @destination_db='<db_name>',
                @sync_type =  'automatic ',
                @subscription_type = 'push',
                @update_mode =  'read only'

--您现在需要手动将任何新列添加到订阅服务器的目标表中,重新运行将运行迷你快照的快照代理...然后启动分发服务器。

【讨论】:

以上是关于是否可以在不提供整个发布快照的情况下更改 SQL Server 复制筛选器?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不运行 DbVisualizer + SQLite 中的原始 sql 的情况下更改列

如何在不更改整个文本视图颜色的情况下更改文本颜色

如何在不创建快照的情况下从 cassandra 表中删除所有记录

Firebase:在不知道父级的情况下查询内部子级

在不重新加载整个表格视图的情况下更改 UITableView 的部分页眉/页脚标题

我可以在不重新构建的情况下对 Maven 构建中的文件进行更改吗?