SQL 服务器事务复制过滤器
SQL Server transactional replication filter
我有一个非常大的 table,我需要从中提取一个记录子集,即最近 30 天的记录,并将这 30 天的记录复制到第二个数据库,以用于报告目的。现在我正在使用事务复制,我在已发布的文章中添加了一个过滤器来隔离 30 天的记录,以获得近乎实时的复制环境。
我遇到的问题是:复制似乎是增量的,这意味着最新的记录被添加到副本中,但较旧的记录没有被删除,因此它不断变大。
当更新超出过滤条件的记录并再次进入过滤条件时,复制会崩溃并显示 "duplicate primary key error"。
如何使副本只包含最近 30 天的数据?
上述行为是我期望看到的吗?
非常感谢,
嗯,最简单的方法,就是不使用 mssql 的过滤器。最简单的方法是将用于更新和删除的 SPS 更改为自定义 sps,这样您就不会在删除(缺失行)和更新(缺失行)时出错。这是通过文章的高级属性完成的。在删除的情况下,您应该只使用合并并在那里过滤您的条件。
还有一个作业可以从表中删除您需要删除的内容。
当然更新结构时需要非常小心,但这是可行的。
另一种更丑陋的方法是保留 sql 的存储过程并忽略错误(通过分发代理 ..-SkipErrors 2601:2627:20598)。这将再次需要删除旧行的作业,并且不会将刚刚更新的旧行带回您的范围。总而言之,第一个解决方案应该是最好的。
希望对您有所帮助。
我有一个非常大的 table,我需要从中提取一个记录子集,即最近 30 天的记录,并将这 30 天的记录复制到第二个数据库,以用于报告目的。现在我正在使用事务复制,我在已发布的文章中添加了一个过滤器来隔离 30 天的记录,以获得近乎实时的复制环境。
我遇到的问题是:复制似乎是增量的,这意味着最新的记录被添加到副本中,但较旧的记录没有被删除,因此它不断变大。
当更新超出过滤条件的记录并再次进入过滤条件时,复制会崩溃并显示 "duplicate primary key error"。
如何使副本只包含最近 30 天的数据? 上述行为是我期望看到的吗?
非常感谢,
嗯,最简单的方法,就是不使用 mssql 的过滤器。最简单的方法是将用于更新和删除的 SPS 更改为自定义 sps,这样您就不会在删除(缺失行)和更新(缺失行)时出错。这是通过文章的高级属性完成的。在删除的情况下,您应该只使用合并并在那里过滤您的条件。
还有一个作业可以从表中删除您需要删除的内容。 当然更新结构时需要非常小心,但这是可行的。
另一种更丑陋的方法是保留 sql 的存储过程并忽略错误(通过分发代理 ..-SkipErrors 2601:2627:20598)。这将再次需要删除旧行的作业,并且不会将刚刚更新的旧行带回您的范围。总而言之,第一个解决方案应该是最好的。
希望对您有所帮助。