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

时间:2016-07-12 14:10:43

标签: ms-access ms-access-data-macro

我有一个第三方软件(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查询和/或触发器没有那么多经验。当我尝试将此代码复制到MS Access查询的SQL视图中时,我会收到几个错误,因此这似乎不是MS Access的一个选项。

我从未使用MS Access中可用的触发器,但似乎可以使用的最接近的触发器是“Before Change”,它被描述为“在保存记录以验证之前运行的创建逻辑”更改,然后决定允许新值,更改值或显示错误以停止更改。使用[IsInsert]属性确定事件是插入还是更新。“此描述告诉我,只有在数据已写入数据库但未保存的情况下才会触发此触发器,因此它实际上不能用于确定是否已存在匹配的ID来执行更新,如果不存在,然后执行插入。我能正确地解释这个吗?

有没有办法在MS Access中寻找我想要的东西?

1 个答案:

答案 0 :(得分:1)

对于您描述的情况,更改前更改数据宏是正确的。但是,您可以将外部进程始终INSERT到日志表中,然后在该表上有一个After Insert数据宏,或者在主表中更新INSERT或UPDATE,如下所示:

AfterInsert.png

当然,期刊表会随着时间的推移而继续增长,因此可以创建计划的维护工作来定期删除旧的期刊记录。