索引视图的 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 事务复制的主要内容,如果未能解决你的问题,请参考以下文章