访问 VBA 在 SQL 服务器视图上创建索引总是创建主键

Access VBA Create Index on SQL Server View always creates Primary Key

我有一个典型的 Access 前端和 SQL 服务器后端。我在 SQL 服务器中创建了一些视图并在 Access 中链接到它们。当我使用“CREATE INDEX index_name ON view_name (field_name)”时,它会创建一个主键,即使我没有指定它这样做(也不希望它这样做) .这是为什么?以及如何创建非主键索引?

这是如何工作的?

任何视图,任何 linked table,事实上你从 SQLServer 访问、使用、消费的任何东西?

所有索引都在 SQLServer 中 100% 设置。 Access 客户端不会、不能也不会为您创建任何类型的索引。

指定和设置主键的创建索引命令?它并没有真正在 Access 中创建索引,而只是设置和告诉 Access 使用什么 PK。

事实上,当你link到一个视图时,系统会提示你select在link到一个视图时进行PK。

SQLServer 视图没有概念,甚至没有设置告诉您或什至让您指定 PK 列。部分原因实际上是一个视图可以包含多个 table - 所以 table 现在是定义主键。事实上,如果您的视图与 5 tables 连接?然后实际上该视图有 5 个不同的主键,来自 5 个不同的 tables).

所以,当你link访问一个视图时,你会注意到这个提示:

如果你不select一个pk专栏?

那你还没有PK组。但是,您可以使用 VBA 来告诉 ACCESS 哪一行是 PK 设置。

所以,上面说的是我在 link 使用 GUI 时没有 select PK。或者说我正在使用代码 link 查看?

然后在设置 PK 值的代码中,我会也应该执行以下命令:

 CurrentDb.Execute "CREATE UNIQUE INDEX IXPK ON dbo_ViewHotelsTest (ID) WITH PRIMARY"

再次:注意上面的评论。创建唯一索引不会在 Access 中创建索引。它也不在 SQLServer 上创建索引。该命令是您可以告诉 Access 哪一列将被视为 PK 的方式。

所以,上面的命令?

用简单的英语:

 Please Mr. Access, will you set the PK column and we are using the above
 command to do this.

换句话说,代码中没有其他命令可以“告诉”Access PK 应该是什么,因此使用了 DDL sql 创建索引命令。但我再次强调,这并没有真正创建索引,只是告诉 Access 将哪个列用作 PK。

如果您在 link 查看视图期间 select PK,此命令会产生相同和相同的结果。

如果要在SQLServer中创建索引?然后转到 SQLServer,并在 SQLServer 中创建索引。

仅供参考: 作为进一步的解释,在 99% 的情况下,您从不想、也不需要,甚至不应该在 SQLServer 端的视图上创建索引。

在任何情况下,如果用于视图源的基础 table 有一个可以使用的索引,那么如果您构建 on-the-fly 查询,它将在所有情况下被使用,构建 SQLServer 端视图,甚至创建 sql 存储过程。在所有情况下,在基本源 table 上简单创建一个索引(使用 SQLServer 工具)就足够了,在所有情况下,包括视图,包括来自 Access 的 linked 视图将自动使用任何以及来自 SQLServer 的基础 table 上的所有现有索引。

因此,不仅对在 linked tables(或 linked 视图)上尝试在 Access 中创建索引的要求为零,而且实际上它甚至不可能。当然,在 link 访问视图时,确实需要使用创建索引命令来设置 PK 列。

如果你link到table,那么Access可以找出哪一列是PK,并会为你设置它。但是 SQLServer 没有设置,甚至没有视图的 PK 列的概念,因此您必须 select 在使用 GUI linking 期间的 PK,或者如前所述,您可以代码执行上述命令,告诉访问将哪一列用作 PK,如前所述,该命令实际上什至不创建索引,但该命令仅告诉访问客户端将哪一列 see/use 作为PK.

您可以查看不需要您“更新”数据的视图。因此,如果没有您 selecting(或更好地说“设置”)的 linked 视图,PK 列将是只读的。

那么,如果您将视图用于组合框,或者说只是一个报表?那你就不管了,也不需要为那个视图设置PK,就“只读”了。因此,这意味着如果您需要更新该视图,您只需要为该视图设置 PK 列(比如代替更新该视图所基于的基础 table)。

所以,总结一下:

创建索引命令实际上并没有创建索引。

仅当您需要允许 Access 客户端更新此类视图的 linked 视图时才需要创建索引命令。如果没有设置,那么 linked 视图将是只读的。那么创建索引的目的、行为、作用和“事情”在 linked 视图上做了什么?它只是告诉 Access 什么列将用于 PK - 它实际上不会在任何地方创建索引 - 包括不在 Access 客户端创建索引。 (所以,唯一的目的是告诉访问哪个列用于 PK。不能真正说明为什么他们以这种方式使用该命令,但最好的猜测是没有其他方式告诉访问什么用于 PK 的列 - 所以我们使用该命令)。

如果您使用 linked table 管理器,并且 re-fresh table links? Access 将记住视图的 PK 设置。但是,如果在 linking 期间更改 linked tables 指向的数据库?然后视图中的 PK 设置将在 re-linking 过程中丢失。 (然后您必须 re-execute 那些命令 re-tell 访问 linked 视图中的哪个列将 seen/used 作为 PK 列。

关于 linked tables 或视图,您不需要为 Access 创建索引客户端 - 所有索引都是自动的,如果索引存在于服务器 table,它将并且可以使用。

因此,创建索引命令是您为 linked 视图设置 PK 列的方式。在所有其他情况下(linked tables - 但不是视图),则不需要该命令,并且在服务器端存在和创建的任何和所有现有索引 table 将被使用(因此无需尝试或在 Access 中创建索引,因为所有此类索引均由服务器端处理 - Access 没有发言权,甚至无法控制 SQLServer 如何使用索引)。但是,在 SQLServer table 上正确使用索引将由 Access 在它向 SQLServer 发出的请求中自动使用。但是索引“工作”是 100% 由服务器管理的——而不是 Access。