2

我有一个将记录插入 MS Access 数据库(.accdb 文件扩展名,而不是 SQL 数据库的前端)的第 3 方软件(Pro-face Pro-Server EX)。在 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 中可用的触发器,但似乎可以使用的最接近的触发器是“更改前”,它被描述为“创建在保存记录之前运行以验证更改的逻辑,并且然后决定允许新值、更改值或显示错误以停止更改。使用 [IsInsert] 属性确定事件是插入还是更新。” 这个描述告诉我这个触发器只会在数据已经写入数据库时​​触发,但不会被保存,所以它真的不能用来确定是否已经存在匹配的 ID 来执行更新,如果不存在,然后执行插入。我是否正确解释了这一点?

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

4

1 回答 1

1

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

插入后.png

当然,日志表会随着时间的推移继续增长,因此可以创建一个定期维护作业来定期删除旧的日志记录。

于 2016-07-12T15:47:43.213 回答