通过MS Access更新SQL Server视图时出现问题。用于此的表集是基于基表构建的。此基表具有此格式。
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)
此表中的一行由我们公司的多个用户组更新。例如,用户组“A”更新列“A1”和“A2”,用户组“B”更新列“B1”和“B2”,依此类推。但是,我们还希望阻止用户组“A”更新用户组“B”的列。为此,我设置了一个视图,其中包含适用于每个用户组的列。例如,用户组“A”的视图仅包含列“Id”,“A1”和“A2”。然后我将SSMS中的视图上的“Bind To Schema”选项设置为“Yes”,并在每个视图的“Id”列上设置唯一的聚簇索引。在MS Access中,我使用ODBC连接将这些视图作为链接表连接。当我在设计视图中打开MS Access中的表并检查索引时,它确实将“Id”列标识为主键。
以下是麻烦的来源:当我尝试在其中一个视图中通过MS Access更新记录时,有时更新会立即运行,但有时更新会超时。这是我得到的错误。
“SM_Notes_Bridge”是我的一个观点的实际名称。我在网上找到的几乎所有以前的答案都说增加了MS Access中更新超时之前的时间,这似乎不是我的问题的解决方案,因为更新要么立即运行,要么超时。没有中间立场。
另一个注意事项是我目前是唯一使用此基表和这些视图的人。此外,围绕该基表结构开发了重要的系统,因此改变其结构将需要很多说服力。
答案 0 :(得分:2)
通过在架构绑定视图上创建唯一索引,您将创建一个索引视图,也称为materialized view。
索引视图的相关属性:
在由大量索引视图或更少但非常复杂的索引视图引用的表上执行DML时,这些引用的索引视图也必须更新。因此,DML查询性能可能会显着降低,或者在某些情况下,甚至无法生成查询计划(MSDN)。
因此,在经常更新的表上创建多个索引视图是一个很大的禁忌!查看this MSDN page以获取有关何时以及何时不使用索引视图的进一步说明。每个插入和更新都必须传播到所有索引视图,并且还会导致对这些视图的锁定。
删除该表上所有视图的索引。就你所告诉我的而言,完全没有理由使用索引视图,并且在执行更新时会以一种主要方式损害性能。即使这不能解决这个问题,也会提高性能。