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