#sql-server #triggers #insert #sql-update
#sql-сервер #триггеры #вставить #sql-обновление
Вопрос:
Я хочу написать триггер, который
- Вставляет только обновленные / вставленные записи из таблицы, например. Обратитесь к другой таблице, скажем, Address_trigger .
- Если запись обновляется несколько раз, в 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];