Microsoft SQL Server, PostgreSQL, Базы данных

Триггер на групповую вставку в таблицу в Microsoft SQL Server

Многие СУБД (например, 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

Оставьте своё мнение...

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.