2016-07-12 76 views
2

我有一个第三方软件(Pro-face的亲服务器EX)被插入记录到MS Access数据库(.accdb文件扩展名,不SQL数据库的前端)。该过程是在临服务器EX软件方面的配置方式是,它仅作为插入(有没有办法来配置它来搜索现有的记录执行更新)到数据库中发送数据。我们有一个客户拥有一个数据库,其中包含预先存在的数据(带有主键的ID字段),他想要做的就是根据ID更新现有记录。我知道在SQL做到这一点的方法,我将配置类似以下的触发:使用的MS Access触发和/或querys来插入或更新记录

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 [email protected],[email protected] WHERE [email protected] 
END 
ELSE 
BEGIN 
    INSERT INTO [dbo].[Table1] (seqno, Data1) VALUES (@seqno, @Data1) 
END 
END 

但是我没有用的MS Access querys和/或触发尽可能多的经验。当我试图将这段代码复制到MS Access查询的SQL视图中时,我得到了一些错误,所以看起来这不会成为MS Access的一个选项。

我从来没有使用MS Access中可用的触发器,但看起来最接近的可以使用的是“更改前”,它被描述为“创建保存记录之前运行的逻辑验证更改,然后决定允许新值,更改值或显示错误以停止更改。使用[IsInsert]属性确定事件是插入还是更新。“这说明告诉我,一旦数据已经写入到数据库触发器将只被绊倒,但不能保存,所以真的不能被用来确定是否匹配的ID已经存在执行更新,如果没有,然后执行插入。我解释正确吗?

有没有办法做什么,我在MS Access找?

+0

Access没有触发器像MSSQL一样。 Access通常使用表单或报表中的事件来处理数据操作。软件是否直接链接Access表以执行插入操作或完成的具体内容? –

+0

@random_answer_guy - Access 2010及更高版本确实具有事件驱动的[数据宏](https://support.office.com/zh-cn/article/Create-a-data-macro-b1b94bca-4f17-47ad-a66d- f296ef834200),它们在表级别上运行并且有点像触发器。 –

+0

@GordThompson - 正确的,我正在使用MS Access 2010.关于插入,软件(Pro-Server EX)有一个配置为使用指针文件(在本例中是另一个.accdb文件)的动作数据库,表和字段写入数据。然后软件在后台生成并执行INSERT语句,因此如果不更改软件,则无法对其进行修改。这需要一些时间,但我们有一位客户现在正在寻找解决方案。 –

回答

1

你是正确的,一前更改数据的宏不会为您所描述的情况下工作。但是,你可以有外部进程总是插入到一个日志表,然后有一个后该表上的任何插入插入数据宏或在主表更新一行,像这样:

AfterInsert.png

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

+0

感谢您的信息,这完美的工作。我在主表上添加了两个额外的数据宏(一个在插入后和一个在更新后),从日志表中删除匹配的记录。这应该(希望)保持日记表的大小。另外,如果缺少任何数据,客户可以使用日记表作为一种事务日志。我以前从未在MS Access(或Access中使用过)中使用过数据宏,因此您的描述和屏幕截图帮助了很多。再次感谢。 –