索引视图的 SQL Server 事务复制

Posted

技术标签:

【中文标题】索引视图的 SQL Server 事务复制【英文标题】:SQL Server Transaction Replication For Indexed Views 【发布时间】:2012-09-03 17:44:53 【问题描述】:

我正在为索引视图进行事务复制。我有其他复制模式绑定视图,它们使用 NOEXPAND 提示引用索引视图。即使我在为索引视图调用 sp_addarticle 之后为 NOEXPANDing 视图调用 sp_addarticle,但我得到了错误:

Hint 'noexpand' on object '...' is invalid.

因为 SQL Server 试图在索引视图上创建索引之前在目标服务器上创建 NOEXPANDing 视图。

有没有办法强制 SQL Server 在开始 NOEXPANDing 视图之前完成索引视图索引的复制?

【问题讨论】:

【参考方案1】:

查看分销商数据库,您会发现用于复制前和复制后的脚本。这些是直接的 sql 脚本,因此您可以修改它们并将您喜欢的任何内容放入其中。

这意味着您可以修改 pre-repl 脚本以避免错误并修改 post-repl 脚本以在创建索引后添加 noexpanding 视图。

【讨论】:

这基本上就是我正在做的事情(这都是程序化的)...我删除了有问题的 NOEXPAND,拍摄快照,等待快照完成,然后运行 ​​ALTER VIEW 来放回 NOEXPAND并让 SQL Replication 处理复制 DDL 更改...但这很麻烦...而且我更喜欢更简单的东西。 您可以通过修改您的出版物来自动化它 - 您可以在其中添加 pre-repl 和 post-repl 脚本并从那里实际修改脚本。为了更好地控制订阅者的索引创建,我过去做过类似的事情。【参考方案2】:

我想我找到了一种更简单的方法。

使用 GUI 将索引视图添加到复制时,只会在架构定义中进行复制,这意味着任何尝试访问这些视图的存储过程如果包含 NOEXPAND 提示,则会出错。

现在我猜你可以弄乱前/后脚本,但使用 MSDN 中的这篇文章:Indexed Views - Replications - NoExpand Hint 似乎有一个更简单的选择。

您可以通过更改 sp_addarticle 的脚本并将 @schema_option 从 0x0000000008000001 替换为 0x0000000008000051 来复制索引。以下示例允许在订阅者处生成聚集索引和非聚集索引。

这会自动跨越索引,也意味着更少的脚本。

【讨论】:

以上是关于索引视图的 SQL Server 事务复制的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 复制:事务发布(读写分离)

SQL Server查询优化和事务处理

SQL Server查询优化与事务处理

浅谈 SQL Server 查询优化与事务处理

如何处理SQL Server事务复制中的大事务操作

SQL Server 2005 事务复制性能