Sql server 关闭索引视图中使用的时态表的系统版本控制

Sql server 关闭索引视图中使用的时态表的系统版本控制,sql-server,indexed-views,Sql Server,Indexed Views,我有一个由许多索引视图使用的表,我想将其转换为时态表。所有用于添加必要列和使用历史记录表设置SYSTEM_VERSIONING=ON的命令都成功执行。但是现在我不能用这个命令禁用系统版本控制 ALTER TABLE [dbo].[MyTable] SET(SYSTEM_VERSIONING = OFF); 我得到了错误 无法更改“MyTable”,因为对象“MyIndexedViewHatReferencesMyTable”正在引用它。 删除所有视图、更改MyTable,然后重新创建所有视图以

我有一个由许多索引视图使用的表,我想将其转换为时态表。所有用于添加必要列和使用历史记录表设置SYSTEM_VERSIONING=ON的命令都成功执行。但是现在我不能用这个命令禁用系统版本控制

ALTER TABLE [dbo].[MyTable] SET(SYSTEM_VERSIONING = OFF);
我得到了错误
无法更改“MyTable”,因为对象“MyIndexedViewHatReferencesMyTable”正在引用它。


删除所有视图、更改MyTable,然后重新创建所有视图以完成此操作似乎不切实际。有没有其他方法可以使该表返回非时态?

您不需要重新创建视图,只需更改、删除schemabinding(这将删除索引)、更改基础表,然后再次更改(将schemabinding放回),然后重新创建索引。当然,仍然有很多工作要做。@AaronBertrand我们对索引视图的查询使用了大量带有(noexpand)提示的
,这是因为SQL标准版本中的遗留代码。在将索引视图设置为普通视图时,如何避免应用程序错误?除了在维护窗口中执行所有操作(可能将数据库设置为单用户,以便应用程序获得连接错误而不是逻辑错误)之外,没有什么聪明的想法。您可以将数据迁移到新表中,创建新的索引视图(以及带有instead of触发器的临时视图,以保持DML操作的透明性),然后删除旧对象并重命名新对象。这并不比删除所有视图并重新创建它们简单,它只允许您对防止应用程序错误进行优先级排序(以多做一点工作为代价)。(此外,我觉得当视图没有索引时,NOEXPAND应该是不可操作的。不幸的是,Microsoft不同意。)