【问题标题】:SQL Server transactional replication cannot copy non-clustered indexSQL Server 事务复制无法复制非聚集索引
【发布时间】:2021-08-07 06:18:39
【问题描述】:

正如标题中提到的,我一直在尝试在我的事务复制中包含非聚集索引。

创建发布时,我已在[为所有表格文章设置属性]中选中“复制非聚集索引”选项

但是在我完成发布创建后,当我再次检查发布属性时,“复制非聚集索引”选项更改为默认值false。无论我尝试改变多少次,它都不会改变。

我的下一个尝试是删除我的虚拟机并从头开始重新创建虚拟机。但它仍然不允许我复制非聚集索引。

然后,我想这可能是我在 VM 中使用的 SQL Server 版本的错误。所以我尝试将整个数据库复制到我的本地主机中,但问题仍然存在

  • My VM SQL Server 版本:SQL Server 2012 标准版
  • 我的本地主机版:SQL Server 2019 开发版

最后我发现有人这么说

使用以下代码:快照中的存储过程将 申请失败:

在 [dbo] 上创建非聚集索引 [IX_TestTable]。#TestTable

但是,稍微改变语法会导致存储过程 创建没有问题:

ALTER TABLE dbo.#TestTable 添加约束 IX_TestTable 唯一 非集群(ID)

但我无法在生产环境中更改索引/重新创建索引。有什么解决办法吗?

  • 更新

我要复制的是我的整个数据库。包括我所有的表格和存储过程。所以我的表不是临时表

【问题讨论】:

  • 您正在尝试在临时表上创建 NC 索引。临时表不会被复制。
  • 嗨@MitchWheat 抱歉,这只是我复制的答案。它不是我的桌子。我的桌子是普通的桌子,不是诱惑的。那么您的意思是“那个”答案不适用于我的情况吗?因为我的表不是临时表?

标签: sql-server replication transactional-replication


【解决方案1】:

我在 SQL-Server 标准 2017 中遇到了同样的情况。我可以看到发布创建的 idx 文件已经包含创建索引的信息,但订阅者忽略了它们。 据我所知,这个问题是old as hell - 如果您使用“快照发布”而不是“事务发布”,那么“复制非聚集索引 = true”设置有效。但对我来说,我需要近时间同步,所以快照对我不起作用。所以回到你的问题: 目前(是的,我正在写作)我将尝试手动传输索引:

  • SourceDB->任务->生成脚本->只选择表->下一步->点击高级
  • 将除脚本索引之外的所有内容设置为 false
  • 保存脚本
  • 打开脚本并删除所有“创建表”条目 -> 你有索引创建脚本。
  • 在您已经创建的发布属性中有一个条目“快照”。在那里,您可以将此脚本作为“应用快照后,执行脚本”运行

哦-现在-它自己创建索引。我还没有安装我的 Post-Run-SQL 脚本,但是创建了索引。 我只能假设,如果第一手没有设置“复制非聚集索引 = true”,那么以后就无法设置它。 在几次错误之后,我删除了目标数据库、订阅者和发布。 我重新创建了数据库。创建事务发布(确保在创建时设置了“复制非聚集索引 = true”),创建订阅者并等待。我应该说什么,他们在那里:-) 但是是的,如果我再次打开出版物,“真实”就消失了……所以至少我认为这是一个错误!

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2012-10-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多