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

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

Многие СУБД (например, MySQL, PostgreSQL и т.д.) умеют правильно обрабатывать события по групповой вставке данных в таблицы. Но не все. Например, триггер на групповую вставку в таблицу в Microsoft SQl Server будет отличаться. Рассмотрим примеры запросов:

[pastacode lang=»sql» manual=»insert%20into%20people%0Aselect%20name%2C%20surname%2C%20age%20from%20portfolio%3B» message=»» highlight=»» provider=»manual»/]

Или такой:

[pastacode lang=»sql» manual=»insert%20into%20people(name%2C%20surname%2C%20age)%20values%0A(‘John’%2C%20’Smith’%2C%2012)%2C%0A(‘Ann’%2C%20’Black’%2C%2029)%2C%0A(‘Samantha’%2C%20’Doeson’%2C%2038)%3B» message=»» highlight=»» provider=»manual»/]

Триггерная функция и триггер на обработку такого запроса в PostgreSQL выглядели бы примерно так:

[pastacode lang=»sql» manual=»CREATE%20OR%20REPLACE%20FUNCTION%20public.update_statistics()%0A%20%20%20%20RETURNS%20trigger%0A%20%20%20%20LANGUAGE%20’plpgsql’%0A%20%20%20%20VOLATILE%0A%20%20%20%20COST%20100%0AAS%20%24BODY%24begin%0Aupdate%20people_statistics%20set%20commonPeopleCount%20%3D%20commonPeopleCount%20%2B%201%3B%0Aupdate%20people_statistics%20set%20peopleCountUnder30%20%3D%20peopleCountUnder30%20%2B%201%20where%20NEW.age%20%3C%2030%3B%0Areturn%20NEW%3B%0Aend%3B%24BODY%24%3B%0A%0ACREATE%20TRIGGER%20on_update_statistics%0AAFTER%20INSERT%0AON%20public.people%0AFOR%20EACH%20ROW%0AEXECUTE%20PROCEDURE%20public.update_statistics()%3B» message=»» highlight=»15″ provider=»manual»/]

Определенные значения в таблице people_statistics обновляются, когда происходит вставка в таблице people.

Самое главное, на что здесь необходимо обратить внимание, — это выделенная строка — FOR EACH ROW. То есть триггер будет обрабатывать все строки, что попадут к нему «в руки».

В Microsoft SQL Server же не все так радужно (кто бы сомневался). Здесь текст триггера необходимо немного изменить, чтобы он понял, что нужно обрабатывать все записи вставки, а не только одну:

[pastacode lang=»sql» manual=»CREATE%20TRIGGER%20%5Bdbo%5D.%5Bpeople_tr%5D%20ON%20%5Bdbo%5D.%5Bpeople%5D%0AWITH%20EXECUTE%20AS%20CALLER%0AFOR%20INSERT%0AAS%0ABEGIN%0A%09update%20people_statistics%20set%20commonPeopleCount%20%3D%20commonPeopleCount%20%2B%20(select%20count(*)%20from%20inserted)%3B%0A%09update%20people_statistics%20set%20peopleCountUnder30%20%3D%20peopleCountUnder30%20%2B%20(select%20count(*)%20from%20inserted)%0A%09%09from%20INSERTED%20I%20where%20I.age%20%3C%2030%3B%0AEND%0AGO» message=»» highlight=»6,7,8″ provider=»manual»/]

 

Возможно, эта запись будет полезной для вас: Триггеры в PostgreSQL

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

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