Вставить триггер обновления

#sql-server #triggers #insert #sql-update

#sql-сервер #триггеры #вставить #sql-обновление

Вопрос:

Я хочу написать триггер, который

  1. Вставляет только обновленные / вставленные записи из таблицы, например. Обратитесь к другой таблице, скажем, Address_trigger .
  2. Если запись обновляется несколько раз, в Address_trigger должно быть доступно только последнее изменение, т.е. Заменить последнюю запись текущей.

Следующий код выполняет первую часть. Но как получить только обновления?

 CREATE or ALTER TRIGGER [dbo].[trgUpdate]
  ON  [dbo].[Address]
  AFTER UPDATE,INSERT
AS 
BEGIN

SET NOCOUNT ON; 
Insert into [Address_trigger] Select * from Inserted
END
 

Комментарии:

1. После триггера обновления данные в таблицах вставляются и удаляются, поэтому вам нужно что-то выбрать i.* из вставлено, как я присоединяюсь к удаленному как d на i.id=d.id

2. Возможно, отношение должно быть наоборот и address_trigger объявлено как временная таблица ? Обычно предпочитают встроенные решения, а не писать триггеры.

Ответ №1:

используйте триггер вставки и обновления, два триггера,

 select 1 as ID, 'C-1' as C1
into [Address];

select *
into Address_trigger
from [Address]
where 1=0;
go;

CREATE TRIGGER [dbo].[trgAddressInsert]
   ON [Address]
   AFTER INSERT
AS 
BEGIN
Insert into [Address_trigger] 
Select * from Inserted;
END;
go;

CREATE TRIGGER [dbo].[trgAddressUpdate]
   ON [Address]
   AFTER UPDATE
AS 
BEGIN

update t1
set C1 = t2.C1
from [Address_trigger] t1 inner join Inserted t2
on t1.ID = t2.ID;

END;
go;

insert into [Address](ID, C1) Values(2, 'c-2');
select * from [Address_trigger];
insert into [Address](ID, C1) Values(3, 'c-3');
select * from [Address_trigger];
update [Address] Set C1 = 'C-U' where ID = 3;
select * from [Address_trigger];
update [Address] Set C1 = 'C-x' where ID = 3;
select * from [Address_trigger];