我们 MSAccess 是不是可以通过 SQL Server 中的外部链接视图插入数据? [复制]
Posted
技术标签:
【中文标题】我们 MSAccess 是不是可以通过 SQL Server 中的外部链接视图插入数据? [复制]【英文标题】:Is it possible to us MSAccess to insert data through an external linked View in SQL Server? [duplicate]我们 MSAccess 是否可以通过 SQL Server 中的外部链接视图插入数据? [复制] 【发布时间】:2020-09-25 20:56:13 【问题描述】:我正在使用 MS Access 2016 和 SQL Server 2012。
我有一个表,表上有一个模式绑定视图。我们的设计是允许我们的用户通过视图插入数据,这样我们就可以为他们进行一些 id 查找,并使用而不是 insert 触发器来审核谁插入了记录。
无论我如何配置,Access 都不想让我将记录添加到视图中。如果我使用该表,它会按预期工作,并且可以让我插入新记录。
我尝试了以下方法:
打开外部表并尝试在底部添加新记录 - 不成功 创建“更新”查询 - 不走运 创建“追加”查询 - 不走运 创建表单,将视图设置为源,并设置数据输入 = 是 - 不成功我正在尝试做的事情是否可能?我来自 SQL/C# 背景,只有基本的 MSAccess 技能。任何帮助表示赞赏!
编辑:我发现 View 在不应该有的时候有一个组。我纠正了这一点,但现在它抱怨它不可更新,因为有多个基础表。
EDIT2:我取得了进展,但并不理想。
更多信息:
此视图表示数据仓库事实,并连接到两个维度表以获取业务键。 我可以通过创建一个包含所有相同字段的“虚拟”表,然后在该表上创建一个视图来实现此功能。我能够插入,但数据立即“删除”回来,因为我的而不是触发器触发了。 数据去了正确的地方,但显然视图没有显示任何数据,因为它实际上不再查询正确的表。 显然视图现在无关紧要,我可能会在虚拟表上编写触发器。 这并不理想,但我认为我的解决方案是让他们通过这个虚拟表插入,然后有第二个视图来执行连接,以便他们可以查看结果。我很欣赏给出的详细答案,但不幸的是它对这种情况没有帮助。
【问题讨论】:
虽然类似,但我不认为这是链接问题的重复,任何希望稍后对此进行分类或投票关闭它的人。 【参考方案1】:如果视图可以从 SSMS 更新,那么它在 Access 中也是如此。因此,在您在 Access 中尝试任何操作之前,您必须首先确保该视图在 SSMS 中是可更新的。因此,并非所有 SQL 视图都是可更新的。
您可以在 SSMS 中测试/检查这一点。
完成此操作后,您必须从访问中链接表。 (如果您搞砸了对视图的修改,则在访问中删除链接的视图并重新链接)。您必须删除访问链接并重新链接。
链接过程需要额外的关注。链接时,系统会要求您提供视图的主键。因为一个视图可以有多个 PK(作为多个表的结果),所以 Access 无法知道或猜测。更糟糕的是,SQL 视图实际上没有定义的 PK,并且没有任何命令或方法可供 Access 用来确定这一点。因此,在该链接过程中会提示您。我注意到这个问题,因为如果您使用一些 VBA 重新链接代码,那么如果您重新链接并更改数据库(或服务器),那么在重新链接过程中,您拥有的 PK 设置将丢失。您只能在新表的链接期间收到此提示 - 而不是重新链接。所以,请记住这个重要的细节。
您可以事后(在链接表后)执行以下命令以在 Access 中使用此命令重新启用或“设置”哪个列是 PK:
我其实是用这个套路的:
Sub createPK(strTable As String, strPK As String)
CurrentDb.Execute "CREATE UNIQUE INDEX " & strPK & _
" ON " & strTable & " (" & strPK & ") WITH PRIMARY"
End Sub
所以,要为链接视图设置 PK,然后我使用这个:
Call createPK("dbo_tblHotels","ID")
仅供参考: 上面的命令不会在访问中为该链接视图创建索引,而是一种仅告诉访问用于 PK 的列的方法。因此,在这种情况下,create index 命令不是创建索引,而是您可以在 Access 中告诉/设置用于 PK 视图的列的方法/方法/方法/过程。如前所述,仅当您使用代码重新链接(或创建)表(在本例中为视图)时才需要执行上述操作。
那么,如果您使用 Access UI,并且链接到视图?然后 Access 将提示/要求您为 PK 选择一列。您可以在链接后使用上述例程/命令在 Access 中设置如果您错过了提示,则将哪个列用作 PK,或者如上所述使用一些 VBA 代码重新链接。
使用 Access UI 重新链接(刷新)到 SAME 数据库将保留 PK 设置。但是如果更改连接字符串(数据库或服务器名称),那么 PK 设置就会丢失。
【讨论】:
【参考方案2】:首先,this 是对类似问题的一个非常好的答案。尝试将 INSTEAD OF 触发器添加到 SQL Server 中的视图。为了插入到视图中,键列必须全部存在,并且每个表必须联合在一起。 INSTEAD OF 触发器可以完全按照您的意愿进行。
【讨论】:
谢谢,但这无关紧要。我没有分区视图,union all 不适用。 您找到想要的东西了吗?我在上面看到了你的注释。以上是关于我们 MSAccess 是不是可以通过 SQL Server 中的外部链接视图插入数据? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
MS Access 2010 查询多次提取相同的记录,sql 挑战
VBA脚本检查MS ACCESS上是不是存在表,如果存在则删除