
Многие СУБД (например, MySQL, PostgreSQL и т.д.) умеют правильно обрабатывать события по групповой вставке данных в таблицы. Но не все. Например, триггер на групповую вставку в таблицу в Microsoft SQl Server будет отличаться. Рассмотрим примеры запросов:
insert into people
select name, surname, age from portfolio;
Или такой:
insert into people(name, surname, age) values
('John', 'Smith', 12),
('Ann', 'Black', 29),
('Samantha', 'Doeson', 38);
Триггерная функция и триггер на обработку такого запроса в PostgreSQL выглядели бы примерно так:
CREATE OR REPLACE FUNCTION public.update_statistics()
RETURNS trigger
LANGUAGE 'plpgsql'
VOLATILE
COST 100
AS $BODY$begin
update people_statistics set commonPeopleCount = commonPeopleCount + 1;
update people_statistics set peopleCountUnder30 = peopleCountUnder30 + 1 where NEW.age < 30;
return NEW;
end;$BODY$;
CREATE TRIGGER on_update_statistics
AFTER INSERT
ON public.people
FOR EACH ROW
EXECUTE PROCEDURE public.update_statistics();
Определенные значения в таблице people_statistics обновляются, когда происходит вставка в таблице people.
Самое главное, на что здесь необходимо обратить внимание, — это выделенная строка — FOR EACH ROW. То есть триггер будет обрабатывать все строки, что попадут к нему «в руки».
В Microsoft SQL Server же не все так радужно (кто бы сомневался). Здесь текст триггера необходимо немного изменить, чтобы он понял, что нужно обрабатывать все записи вставки, а не только одну:
CREATE TRIGGER [dbo].[people_tr] ON [dbo].[people]
WITH EXECUTE AS CALLER
FOR INSERT
AS
BEGIN
update people_statistics set commonPeopleCount = commonPeopleCount + (select count(*) from inserted);
update people_statistics set peopleCountUnder30 = peopleCountUnder30 + (select count(*) from inserted)
from INSERTED I where I.age < 30;
END
GO
Возможно, эта запись будет полезной для вас: Триггеры в PostgreSQL
Понравилось это:
Нравится Загрузка...
Похожие записи