访问表单无法传递视图的主键(到 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 服务器)的主要内容,如果未能解决你的问题,请参考以下文章
INSERT INTO table RETURNING 触发器生成的主键从 SQL Server 链接服务器到 Oracle (11g)