访问表单无法传递视图的主键(到 SQL 服务器)

Posted

技术标签:

【中文标题】访问表单无法传递视图的主键(到 SQL 服务器)【英文标题】:Access form fails to pass primary key of a view (to SQL server) 【发布时间】:2019-12-16 14:45:48 【问题描述】:

背景 - 设置:

    SQL 服务器表 (5) 查看相同的表,其中地址表的 ID 实际上是视图的 PK 视图上的 INSTEAD OF 触发器用于插入、更新和删除 INSTEAD OF UPDATE 触发器检查 4 个基表中的记录,如果不存在则创建它(更多背景信息:这解决了视图更新失败的问题,因为并非所有 5 个基表都有记录) 通过链接表访问 db 到 5 个表和视图本身 显示和允许编辑视图的访问表单

问题:表单中记录的编辑失败,因为地址表的 ID 作为 NULL 传递。 “无法将值 NULL 插入列...”这来自 INSTEAD OF UPDATE 触发器,如上所述。

为了解决这个问题,表单似乎必须在更新时将地址表的 PK 传递给视图。尽管在 Access 的链接表中显示了 PK,但它并没有被传递。

要让 Access 表单将视图的 PK 传递给视图中的任何和所有记录更新,需要什么?

【问题讨论】:

这听起来像您的触发器是问题,而不是 Access。发布您的INSTEAD OF UPDATE 触发器的定义将极大地帮助我们帮助您。 Access 不会传递SET 子句中的主键列,只传递WHERE 子句中的主键列,因为它应该传递,因为通常不应更新主键。如果您的 INSTEAD OF UPDATE 触发器无法正确处理,那是您的错。 【参考方案1】:

我会采用不需要子记录的设计。 (在查询中使用左连接)。

在 Access 中编辑相关数据往往表明每个表单都基于一个表。如果您将焦点从主窗体移动到子窗体,Access 会自动保存主记录。

客户没有发票或未预订旅行这一事实无关紧要。因此,大多数设计都建议不必存在子记录,因此,对此类数据的大多数查询将是左连接。这种方法将节省大量工作。我会尝试避免对多个表的 sql 进行更新。作为一般规则,每个表格都应直接基于链接表。如果用户需要添加子记录,则为 UI 提供允许这样做的正确子表单。结果是每个表单(和子表单)只更新一个表。

【讨论】:

我确实采用了推荐的设计。我发现使用选项卡控件(每个选项卡都有一个用于单个表的子表单)比使用具有多个基表和触发器的视图更直接。

以上是关于访问表单无法传递视图的主键(到 SQL 服务器)的主要内容,如果未能解决你的问题,请参考以下文章

一起提交 2 个表单,将其中一个的主键作为外键传递给另一个

无法将行添加到 SQL Server 视图

无法访问 PostgreSQL 触发函数中的主键值

INSERT INTO table RETURNING 触发器生成的主键从 SQL Server 链接服务器到 Oracle (11g)

Django:如何在urlpatterns中访问其他模型的主键?

oracle:物化视图中的主键列