Использование триггеров и / или запросов MS Access для вставки или обновления записи

У меня есть стороннее программное обеспечение (Pro-face Pro-Server EX), которое вставляет записи в базу данных MS Access (расширение файла.accdb, а не интерфейс для базы данных SQL). Способ конфигурирования процесса на стороне программного обеспечения Pro-Server EX заключается в том, что он отправляет данные в базу данных только в виде вставки (нет способа настроить его на поиск существующей записи для выполнения обновления). У нас есть клиент, у которого есть база данных с уже существующими данными (с полем идентификатора, который является первичным ключом), и все, что он хочет сделать, это обновить существующую запись на основе идентификатора. Я знаю способ сделать это в 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. Когда я пытаюсь скопировать этот код в представление SQL запроса MS Access, я получаю несколько ошибок, так что кажется, что это не совсем вариант для MS Access.

Я никогда не использовал триггеры, доступные в MS Access, но похоже, что наиболее близким из них является "До изменения", который описывается как "Создать логику, которая запускается до сохранения записи для проверки изменений, и затем решите разрешить новые значения, изменить значения или показать ошибку, чтобы остановить изменения. Используйте свойство [IsInsert], чтобы определить, является ли событие вставкой или обновлением." Это описание говорит мне, что этот триггер будет отключен только после того, как данные уже записаны в базу данных, но не сохранены, поэтому его нельзя использовать для определения, существует ли соответствующий идентификатор для выполнения обновления, и если нет, затем выполните вставку. Я правильно интерпретирую это?

Есть ли способ сделать то, что я ищу в MS Access?

1 ответ

Решение

Вы правы в том, что макрос данных "Перед изменением" не будет работать в описываемой вами ситуации. Тем не менее, вы можете иметь внешний процесс всегда вставлять в таблицу журнала, а затем макрос данных после вставки для этой таблицы либо вставлять или ОБНОВИТЬ строку в основной таблице, например, так:

AfterInsert.png

Конечно, таблица журнала будет продолжать расти со временем, поэтому можно было бы запланировать задание обслуживания для периодического удаления старых записей журнала.

Другие вопросы по тегам