为什么将视图链接到Access后变为只读?

时间:2018-12-22 23:50:45

标签: sql-server ms-access

在SQL Server Management Studio中,我同时创建了索引视图和常规(非索引)视图。当我更新数据时,基表的数据也被更改。但是,当我使用VBA或Access GUI链接表将视图链接到Access时,我需要指定一个索引。如果我不这样做,那么该视图将是只读的。

为什么非索引视图只能在Access中读取,而不能在SQL中读取?

2 个答案:

答案 0 :(得分:2)

我个人发现很难消化接受的答案并找出问题所在以及如何解决它。

为什么链接视图不可编辑?

本质上,SQL Server 视图没有主键 (PK),因此被 MS Access 视为只读(不可更新),因为 MS Access 需要一个唯一的列来用于更新。

如何在链接视图中编辑数据

链接视图后,必须在 MS Access 中创建 唯一索引

例如,如果表名为 dbo_table,SQL 中的 PK 列名为 id,则创建一个新查询并将以下内容粘贴到其中:

CREATE UNIQUE INDEX myPK ON dbo_table (id ASC)

单词 myPK 是索引的名称(如果需要,可以重命名)。执行查询。

链接视图现在可以更新。

MS Access CREATE INDEX 的参考文档在 here 可用。

答案 1 :(得分:1)

首先,当您使用Access GUI链接到表时,它永远不会提示您输入索引,而是提示您输入主键。那么,让我们像REAL一样迅速地纠正那些疯狂和愚蠢的错误信息,对吧?

链接到SQL Server视图时,出现以下提示:

enter image description here

以上提示并不要求您提供索引。

之所以要执行此操作,是因为它需要PK来更新链接表或链接视图。

问题: SQL Server没有为视图定义的PK。而且SQL Server不会让您为视图指定PK。如果SQL Server有某种方法可以为视图定义PK,则Access可以使用该信息来获取PK。

但是,由于视图在sql server上没有PK,因此在链接到此类视图时,您必须由人类来选择PK。

访问链接表是只读的,没有PK。 访问链接的视图是只读的,没有PK。

但是,sql server视图没有定义PK。

再次: SQL Server视图未定义PK。

如果使用VBA代码创建链接视图,则不会出现GUI提示询问您PK。您可以通过执行本地create index命令告诉Access将哪一列“假定”为PK。该命令实际上无法创建索引。它不会创建一个服务器端,也不会在访问客户端上创建实际的工作索引。

create index命令所做的只是告诉access使用哪个PK列。因此,在这种情况下,您实际上并没有创建索引。

再次: SQL Server视图未定义PK。

如果SQL Server允许用户为视图创建或设置PK,则Access可以简单地使用该信息并知道要使用的PK,然后为您设置。

但是(再次) SQL Server没有为视图定义PK。

但是,对于访问客户端而言,要更新链接表,它需要一个PK。链接到表时,Access可以简单地询问SQL Server PK的列。但是,您不能询问SQL Server

视图的“主键是什么”。

(不过,您可以在桌子上用餐)。

因此,您不会在Access中创建索引(因为在具有链接表的访问的客户端上的索引或者链接视图不是工作索引,并且没有任何作用,所以它什么都不做!告诉访问权限什么是PK。)它不是工作索引,甚至不是真实索引。

在Access中为链接表/视图存在索引实际上并不会创建工作索引-只是在您“创建”该索引时存储了一些“额外”信息,例如表中是否存在PK。

同样:Access不会为链接表创建索引。在链接表上执行创建索引时,在这种情况下不会创建索引。仅在本地存储有关表或视图的信息。

再次:您没有创建索引。

再次: 如果sql server具有为视图定义PK的功能或选项,那么毫无疑问Access也将使用该信息。但是,sql server中的视图没有定义的PK,因此Access无法使用PK,并且如果access找不到PK,则它假定该表是只读的。

SQL管理工作室通常可以在没有PK的情况下更新表,但是Access必须使用ODBC才能连接到sql服务器,并且在连接到数据库时ODBC具有FAR LESS功能,然后具有SSMS。