插入到 SQL Server 中的视图中
Posted
技术标签:
【中文标题】插入到 SQL Server 中的视图中【英文标题】:inserting into a view in SQL server 【发布时间】:2009-08-27 08:15:46 【问题描述】:我有一个 SQL Server 作为后端,并使用 ms 访问作为前端。
我有两个表(persons
和 managers
),manager
派生自 persons
(1:1 关系),因此我创建了一个视图 managersFull
,它基本上是一个:
SELECT *
FROM `managers` `m`
INNER JOIN `persons` `p`
ON `m`.`id` = `p`.`id`
persons
中的id
是自增主键,managers
中的id
是主键和外键,引用persons
.id
现在我希望能够在 ms 访问中插入一个带有表单的新数据集,但我无法让它工作。没有错误消息,没有状态行,什么都没有。新行没有插入,我必须按 Escape 取消我的更改才能返回到 ms 访问中的设计视图。
我说的是managers
表单,我希望能够在一个表单中同时输入经理和个人信息
我现在的问题是:我想在这里做什么有可能吗?如果没有,是否有使用后插入触发器或一些 vba 代码行的“简单”解决方法?
提前致谢
【问题讨论】:
【参考方案1】:问题是您的视图跨越多个表。如果您访问多个表,您可以只更新或插入其中一个。
有关限制和proper strategies for view updates的更多详细信息,请查看MSDN
【讨论】:
是的,有策略。我已经用 MSDN 链接更新了我的答案。这篇文章craigsmullins.com/cnr_0299b.htm 可能也会有所帮助【参考方案2】:假设 ODBC,需要考虑的一些事情:
确保您在人员表中有一个时间戳字段,并且该字段在您的经理视图中返回。您可能还需要管理器视图中人员表的真实 PK(我假设您的视图采用用于自联接的 FK 并将其别名为 ID 字段——我自己不会这样做,因为它令人困惑。相反,我会在管理器视图中使用真正的外键名称,并让 PK 以其真实名称独立存在。
在您的记录源中尝试使用 Jet/ACE 特定的 DISTINCTROW 谓词。使用 Jet/ACE 后端,这通常可以在不可能的情况下插入到两个表中。不过,我不确定 Jet 是否会足够聪明地告诉 SQL Server 做正确的事情。
如果这些都不起作用,请更改您的表单以使用基于您的人员表的记录源,并使用基于经理视图的组合框作为您编辑记录以将人员关联到的控件经理。
【讨论】:
【参考方案3】:Ilya Kochetov 指出您只能更新一个表,但解决方法是将更新应用到一个表上的字段,然后再应用另一个表。此解决方案假定您对这两个表的唯一访问权限是通过此视图,并且不允许您创建存储过程来处理此问题。
【讨论】:
【参考方案4】:要在访问中建模和维护两个相关的表,您不要使用作为两个表连接的查询或视图。您所做的是使用主表单,并放入基于子表的子表单。如果子表单中的链接主子设置设置正确,则无需编写任何代码,access会在链接字段中插入人的id。
所以,不要在这里使用连接表。只需使用表单+子表单设置,您就可以编辑和维护相关子表中的数据和数据。
这意味着您将表单基于表格,而不是视图。并且您将子表单基于子表。所以,不要在这里使用视图。
【讨论】:
以上是关于插入到 SQL Server 中的视图中的主要内容,如果未能解决你的问题,请参考以下文章