使用 MS Access 在 SQL 服务器视图上更新查询超时

Update Query Timeout on SQL Server View with MS Access

我在通过 MS Access 更新 SQL 服务器视图时遇到了一些问题。用于此目的的 table 集是在基础 table 的基础上构建的。这个基础table就是这种格式。

Id    int (not-nullable; auto-assigned)
A1    varchar(50) (nullable)
A2    varchar(50) (nullable)
B1    varchar(50) (nullable)
B2    varchar(50) (nullable)
C1    varchar(50) (nullable)
C2    varchar(50) (nullable)

此table上的一行由我们公司的多个用户组更新。例如,用户组 "A" 更新列 "A1" 和 "A2",用户组 "B" 更新列 "B1" 和 "B2",等等。但是,我们还想阻止用户组 "A" 更新用户组 "B" 的列。为此,我设置了一个视图,其中包含适合每个用户组的列。例如,用户组 "A" 的视图将仅包含列 "Id"、"A1" 和 "A2"。然后,我将 SSMS 中视图的 "Bind To Schema" 选项设置为 "Yes",并在每个视图的 "Id" 列上设置了一个唯一的聚集索引。在 MS Access 中,我使用 ODBC 连接以链接 table 的形式连接到这些视图。当我在设计视图的 MS Access 中打开 tables 并检查索引时,它确实正确地将 "Id" 列识别为主键。

问题来了:当我尝试在其中一个视图中通过 MS Access 更新记录时,有时更新会立即运行,但有时更新会超时。这是我得到的错误。

"SM_Notes_Bridge"是我的一个观点的真实名称。我可以在网上找到的几乎所有以前的答案都说要增加 MS Access 中更新超时之前的时间量,这似乎不是我的问题的解决方案,因为更新要么立即运行,要么超时。没有中间立场。

另一个要注意的是,我是目前唯一使用此基础 table 和这些视图的人。此外,重要的系统都是围绕该基础 table 结构开发的,因此更改其结构需要很多说服力。

通过在模式绑定视图上创建唯一索引,您正在创建索引视图,也称为 materialized view

相关 属性 个索引视图:

When executing DML on a table referenced by a large number of indexed views, or fewer but very complex indexed views, those referenced indexed views will have to be updated as well. As a result, DML query performance can degrade significantly, or in some cases, a query plan cannot even be produced (MSDN).

因此,在经常更新的 table 上创建多个索引视图是一个很大的禁忌!查看 this MSDN page 以进一步说明何时以及何时不使用索引视图。每次插入和更新都必须传播到所有索引视图,并且也会导致锁定这些视图。

删除 ALL 视图上的索引 table。就您告诉我的而言,根本没有理由使用索引视图,它们会在执行更新时以主要方式损害性能。即使这不能解决此问题,它也会提高性能。