如何创建一个更新SQL Server视图中的表的Access窗体

时间:2011-08-14 15:13:15

标签: sql-server ms-access

我正在将Access前端/ Access后端应用程序移植到Access前端/ SQL Server后端,并且遇到了特定表单的问题。我认为这是因为我没有正确理解我想要做的事情的基本概念。特别是通过视图更新数据。

它是一个资源预订应用程序,我有“客户”,主要通过他们的clientID知道,试图在“日记”中预订“资源”(由其resourceID知道)。 “日记”中的每条记录都是预订,包含预订的日期和时间以及clientID和resourceID。

在现有的Access应用程序中,我有一个查询作为表单的记录源,该表单通过它们的相互clientID连接日记和客户端。沿着这些方向的东西(虽然在真实的东西中涉及更多的领域)

SELECT d.bookdate,d.booktime, d.clientID, c.clientID AS CID, c.name
FROM diary d INNER JOIN client c ON d.clientID = c.clientID
ORDER BY bookdate,booktime

我发现我可以通过打开表单为clientID创建一个新的日记录 acFormAdd和OpenArgs设置为clientID,并将表单加载写入数据字段CID(c.clientID)喜欢的表单字段,因此

    DoCmd.OpenForm "frmDiary", acNormal, , "ClientID = " & Me.ClientID, acFormAdd, , Me.ClientID

然后在Form_Current子

中的frmDiary中
    If Nz(Me.OpenArgs, "") <> "" Then Me.CID = Me.OpenArgs

写入Me.CID字段(该数据已存在的查询的一侧)导致在日记表中创建新记录,同时使用来自该日志表的正确数据填充表单。客户记录中的其他字段。

在应用程序的SQL Server版本中,我动态创建tabledef,以指向启动序列期间SQL Server数据库的正确实例中的表。我还为适当的视图创建tabledef。我动态地这样做,使我能够很容易地在我的数据库的各种版本之间切换。

因为我的日记表长度为80,000条记录,而客户端表的长度为40000条记录,所以我并不特别想在Access客户端中进行两者的连接。因此,我在SQL Server上创建了一个与上面的select子句匹配的视图(减去order by),并在初始化期间为它创建了一个tabledef。

但是整个表单不起作用,因为它告诉我视图不可更新。这似乎可以通过在Access中打开tabledef作为数据表来确认 - 导航集中没有新的记录按钮。

我正在努力,因为

  1. 我不明白db_datawriter角色如何转换为写入数据库的权限。 (我的应用程序连接为服务器登录名,该登录名与分配了db_datawriter角色的数据库用户匹配)。所以我不知道这是否延伸到视图以及我的问题是否是权限问题。我正在使用SQL Server Management Studio浏览数据库并查看权限属性。
  2. 我已经读过,只能更新视图中属于构建视图的基表之一的视图中的字段。这使我编写表格的Me.CID字段以刺激创建新日记记录的“技巧”似乎不是正确的方法。
  3. 所以我不确定我的下一步应该是什么。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我的问题的一个关键要素是“你如何让视图更新?”。简单的回答是给它一个独特的聚集索引。

我发现虽然您可以在视图上创建,但如果您更改了视图(比如添加其他字段),则需要重新创建索引,因为它会被删除。

答案 1 :(得分:0)

这是视图的代码吗?

SELECT d.bookdate,d.booktime, d.clientID, c.clientID AS CID, c.name
FROM diary d INNER JOIN client c ON d.clientID = c.clientID
ORDER BY bookdate,booktime

如果是,您将无法更新视图。如果视图上只有一个表,则只能使用视图更新表。来自MSDN:

Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table

但为什么你需要使用视图来更新?

关于db_datawriter,你是对的。如果登录映射到具有db_datawriter的用户,则为 写数据时不应该面临许可问题。