SQL Server 2005复制

DBA*_*rew 6 database sql-server replication sql-server-2005

环境:SQL Server 2005 SP2(9.0.3077)事务性出版物(生产和测试版)

我有一种情况,我有两个不同的复制发布设置,使用一些相同的文章.这些出版物中的每一个都在不同的机器上提供订阅者.这些共享文章中的一个是表格.在一个固定的时间间隔内,该表中的许多记录都会变老并且不再需要.此时,将调用删除记录的存储过程.

为了节省资源并改善订阅者的延迟时间,我已将此存储过程的replicate属性设置为"执行存储过程"而不是默认的"仅存储过程定义".这样,当存储过程删除2,000,000多条记录时,这些记录不会复制到订阅者.而是复制存储过程的执行,并执行订阅者上相同的复制存储过程,并删除相同的2,000,000多行.

我遇到的问题是我的第二份出版物.我不需要这种类型的行为,所以我将存储过程集上的article属性设置为"仅存储过程定义",并期望复制删除其他订户的行,但事实并非如此.订户的表格不断获得记录.所以要修复它我将Article属性设置为"Execution ..."并称之为好.这可能是最佳的解决方案,因此beta与生产匹配,但它仍然感觉像一个kludge,因为出版物属性应该彼此独立工作.

问题:为什么"执行存储过程"文章属性优先并应用于其他出版物,即使它在另一个出版物中设置为"仅存储过程定义"?

Sim*_*hes 2

我们在公司中广泛使用复制,因为我们在多个国家/地区拥有 38 个仓库,所有数据都复制回我们位于伦敦的主服务器。

首先,您的复制过滤器应该使用视图,即使是简单的视图。这样,如果您需要调整过滤器(阅读 WHERE 子句),您只需更改视图即可完成。否则你必须重新发布你的数据,并重新订阅每个人,这可能是一个真正的痛苦。

您提到您在订阅者和发布者上运行相同的删除以保持它们同步。这让我脊背发凉。您最好在一处删除它们并让服务器将所做的更改复制到订阅者。自 SQL Server 2005 以来,复制现在非常快速且高效。SQL 2000 的复制速度过去和现在都相当慢。如果您使用 SQL 2005/2008,只需确保您的兼容性级别(右键单击数据库、属性、选项)设置为 90 (2005) 或 100 (2008)。这会将 sql server 切换到快速高效的复制方法。

另一种方法是不删除数据,而是保留数据并使用发布中的 where 子句将其过滤掉。