为啥 Access 希望您识别链接表上的主键?

Posted

技术标签:

【中文标题】为啥 Access 希望您识别链接表上的主键?【英文标题】:Why does Access want you to identify a primary key on linked tables?为什么 Access 希望您识别链接表上的主键? 【发布时间】:2010-07-30 18:37:27 【问题描述】:

我支持使用 MS Access 作为前端查看我们机构中的一些 Oracle 表的用户。他们的典型用途是使用 Access 查询构建器编写即席查询,他们也喜欢 Access,因为它使他们能够构建可打印的报告,而无需通过我们的技术支持部门提交冗长且昂贵的编程请求过程。

在创建指向外部表的链接时,有时会要求他们识别表的主键。当然,他们怎么可能知道主键字段是什么?

我的问题是:为什么 Access 想知道链接表的主键字段是什么?索引应该在源数据库中进行,不是吗?

当用户开始迁移到 Access 2007 时,我们最近遇到了一个问题,该问题最终通过两种方式“修复”:1) 新的 ODBC 连接,或 2) 为链接表识别不同的主键列。我的技术支持试图坚持我必须通过告诉我的用户选择正确的主键字段来修改我的做法。我争辩说应该没关系。但我不能否认 MS Access 不会询问它是否对 某事 无关紧要的想法。只是不确定那可能是什么。

注意:这篇文章中描述了“问题”:Access 2007 to Oracle 10g linked table -- query with flawed results, but no errors thrown

【问题讨论】:

访问?! SQLPlus .. 只有! ]:) SQLPlus... 是的,这就是 的样子。如果我的用户曾经学习过 SQL,我们将能够超越 Access 查询构建器……如果有的话! :-P 【参考方案1】:

如果您的用户只需要只读访问权限以进行查询和报告,请让他们单击取消以响应 Access 关于将哪些字段用作主键的问题。他们应该仍然可以创建链接,但它将是只读的。

如果您的用户需要修改链接的 Oracle 表中的数据,请向他们提供您为他们创建的 Access 数据库文件的副本。您设置了链接表,并且连接属性存储在链接的 TableDef 中......访问之后不需要再引用您的 DSN 以获取该链接。所以用户也不需要DSN。

【讨论】:

谢谢——这是个好建议。我明白(我认为)PK Access 想要的只是让它可编辑,否则我不需要它。这就是我的想法……只是想确定一下。至于您对 DSN 的看法——听起来一般来说这是个好主意,但我的用户会经常链接到他们自己的表格——我们的机构有数百个,如果不是数千个表格可供选择,我不能(或者至少,真的不想)为所有这些设置链接,以防万一它们被使用。无论如何都很难让它们保持最新,因为表被添加/修改了。 考虑为您的用户提供文件 DSN 以创建他们的链接。此外,他们应该为结构发生更改的任何远程表删除并重新创建链接,因为 Access 在创建链接时存储有关 ODBC 源的元信息,并且在表定义更改时不会更新。您的 Oracle DBA 是否参与其中? 谢谢。是的——我了解所有这些东西——主要是,我只是想知道为什么 Access 要求对链接表进行 PK——如果它比我以前想象的要多的话。出于某种原因,Access 2007 与我们的旧 ODBC 驱动程序(仍然适用于以前版本的 Access)存在问题,导致查询结果奇怪。我们多年前写驱动的技术支持确信没问题,问题是用户在链接表时选择了错误的PK造成的。我的工作是让他们相信是时候审查他们的编程了。 :-) 无论如何...感谢您的反馈 表真的有PK吗?如果不是,那么这就是问题所在!如果他们这样做了,并且您的 ODBC 驱动程序没有为 Jet/ACE 提供正确的表元数据(包括但不限于 PK 是什么),那么这是 ODBC 驱动程序设计中的错误,无论它可能工作得多么好过去使用以前版本的 Access。 Access 需要知道 PK 才能更新正确的记录。如果没有 PK,它将尝试执行复合 WHERE 子句(我认为),但在这样做时,Nulls 确实会搞砸(Jet/ACE 并不总是足够聪明,无法使用 Is Null 而不是 =Null)。是的,当然,如果它是只读的,那么这些都不是必需的,但我不知道 Access 是为这种灵活性而构建的。我怀疑它会假设读/写并需要PK。【参考方案2】:

除非用户知道键是什么,否则用户将如何知道该表的含义或如何将其连接到其他表?了解存在哪些键对于从 SQL 数据库中获得有用的结果非常重要。

【讨论】:

他们知道表格的含义,因为口耳相传,有人说“你从某某表格中得到一份员工名单”。不知道如何加入表格的人不会加入表格。做的人,做的。连接不一定需要任何主键知识。当然,在父子关系中,但在许多其他情况下您可能想要连接表。我们的用户范围从非常熟练到零技能,总共大约有 2000 个,其中只有大约 43 个是您可能想要称之为“技术人员”的人。其余为经理或秘书等。【参考方案3】:

不仅使用pk进行更新。同样在进行异构连接时,即。在 odbc 表和本地表或来自不同 odbc 源的表之间,访问需要将所有数据获取到本地进行连接。拥有 pk 可以循环使用 pk 对外部源进行多次查询。这对于小型本地表和长长的 odbc 表非常有用。

【讨论】:

以上是关于为啥 Access 希望您识别链接表上的主键?的主要内容,如果未能解决你的问题,请参考以下文章

Access 中 SQL 链接表上的 UPDATE 查询的“操作必须使用可更新查询”

将自动递增的主键插入 Access 表

innodb 存储引擎为啥要用一个自增的主键

Access 2007 使用选项卡将多个子表单链接到主表单的最佳方式

使用 Microsoft Access ODBC 链接到 Oracle 控制哪些列成为主键

为啥我需要将子表的主键作为父表的外键,而不是相反的 1:1 识别关系?