使用 MS Access 触发器 and/or 查询来插入或更新记录

Using MS Access triggers and/or querys to either insert or update a record

我有一个第 3 方软件 (Pro-face Pro-Server EX),可以将记录插入 MS Access 数据库(.accdb 文件扩展名,不是 SQL 数据库的前端)。该过程在 Pro-Server EX 软件端的配置方式是它仅将数据作为插入发送到数据库(无法将其配置为搜索现有记录以执行更新)。我们有一个客户有一个数据库,其中包含预先存在的数据(ID 字段是主键),他想要做的就是根据 ID 更新现有记录。我知道在 SQL 中有一种方法可以执行此操作,我可以在其中配置类似于以下内容的触发器:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[update_table]
 ON  [dbo].[Table1]
 INSTEAD OF INSERT
AS

DECLARE @seqno int
DECLARE @Data1 int

BEGIN
SET @seqno = (Select seqno from INSERTED)
SET @Data1 = (Select Data1 from INSERTED)

IF EXISTS (SELECT seqno FROM [dbo].[Table1] WHERE seqno = @seqno)
 BEGIN
  UPDATE [dbo].[Table1] SET seqno=@seqno,Data1=@Data1 WHERE seqno=@seqno
 END
ELSE
 BEGIN
  INSERT INTO [dbo].[Table1] (seqno, Data1) VALUES (@seqno, @Data1)
 END
END

但是我对 MS Access 查询 and/or 触发器没有太多经验。当我尝试将此代码复制到 MS Access 查询的 SQL 视图中时,出现了几个错误,因此这似乎不是 MS Access 的真正选项。

我从未使用过 MS Access 中可用的触发器,但似乎可以使用的最接近的触发器是 "Before Change",描述为 "Create Logic that runs before a record is saved to validate changes, and then decide to allow the new values, change the values, or show an error to stop the changes. Use the [IsInsert] property to determine if the event is an insert or an update." 此描述告诉我只有在数据已经写入数据库但未保存时才会触发此触发器,因此它确实不能用于确定匹配的 ID 是否已存在以执行更新,如果不存在,则执行插入.我的解释正确吗?

有没有办法在 MS Access 中实现我想要的功能?

您说得对,更改前数据宏不适用于您描述的情况。但是,您可以让外部进程始终插入到日志 table 中,然后在该 table 上插入数据宏后插入或更新主 table 中的一行,如下所示:

当然,日志 table 会随着时间的推移不断增长,因此可以创建计划维护作业以定期删除旧的日志记录。