插入SQL Server中的视图

时间:2009-08-27 08:15:47

标签: sql-server ms-access join insert view

我有一个SQL Server作为后端,并使用ms访问作为前端。

我有两个表(personsmanagers),manager派生自persons(1:1关系),因此我创建了一个视图{{1这基本上是:

managersFull
SELECT * FROM `managers` `m` INNER JOIN `persons` `p` ON `m`.`id` = `p`.`id` 中的{p> id是自动递增的,persons中的主键id是主键和外键,引用managers。{{ 1}}

现在我希望能够插入一个带有ms访问形式的新数据集,但我无法使其工作。没有错误信息,没有状态行,没有。没有插入新行,我必须按下escape才能取消我的更改以返回ms访问中的设计视图。

我说的是persons表单,我希望能够以单一形式同时输入经理和个人信息

我现在的问题是:我可以在这里做什么?如果没有,是否有一个“简单”的解决方法使用插入触发器或一些vba代码行?

提前致谢

4 个答案:

答案 0 :(得分:2)

问题是您的视图跨多个表。如果您访问多个表,则只能更新或插入其中一个表。

另请查看MSDN以获取有关限制的详细信息以及proper strategies for view updates

答案 1 :(得分:1)

假设ODBC,需要考虑一些事项:

  1. 确保在person表中有一个时间戳字段,并在管理器视图中返回该字段。您可能还需要管理器视图中人员表的真实PK(我假设您的视图采用用于自联接的FK并将其作为ID字段别名 - 我不会自己这样做,因为它令人困惑。相反,我会在管理器视图中使用真正的外键名称,并让PK凭借其真实名称独立存在。)

  2. 在您的记录源中尝试Jet / ACE特定的DISTINCTROW谓词。使用Jet / ACE后端,这通常可以在不可能的情况下插入两个表中。我不确定Jet是否会足够智能告诉SQL Server做正确的事情。

  3. 如果这些都不起作用,请将表单更改为使用基于人员表的记录源,并使用基于管理器视图的组合框作为控件,使用该控件编辑记录以将人员关联到经理。

答案 2 :(得分:0)

Ilya Kochetov指出,您只能更新一个表,但解决方法是将更新应用于一个表上的字段,然后再应用于另一个表。此解决方案假定您对这两个表的唯一访问是通过此视图,并且不允许您创建存储过程来处理此问题。

答案 3 :(得分:0)

要在访问中建模和维护两个相关表,请不要使用作为两个表的连接的查询或视图。你要做的是使用一个主窗体,并放入一个基于子表的子窗体。如果正确设置了子表单中的链接主设置和子设置,则无需编写任何代码,访问权限将在链接字段中插入此人的ID。

所以,不要在这里使用连接表。只需使用表单+子表单设置,您就可以编辑和维护相关子表中的数据和数据。

这意味着您将表单基于表格而不是视图。并且您将子表单基于子表。所以,不要在这里使用视图。