Нека започнем с това, че никога не бих и имам предвид никога да не извиквам съхранена процедура в тригер. За да отчетете вмъкване на няколко реда, ще трябва да преминете с курсор през proc. Това означава, че 200 000 реда, които току-що сте заредили чрез заявка, базирана на набор (да речем актуализиране на всички цени с 10%), може да блокират таблицата за часове, докато тригерът се опитва храбро да се справи с натоварването. Освен това, ако нещо се промени в процедурата, можете изобщо да прекъснете всички вмъквания в таблицата или дори напълно да затворите масата. Твърдо вярвам, че тригерният код не трябва да извиква нищо друго извън тригера.
Лично аз предпочитам просто да си върша задачата. Ако съм написал действията, които искам да извърша правилно в тригера, той само ще актуализира, изтрие или вмъкне там, където колоните са променени.
Пример:да предположим, че искате да актуализирате полето last_name, което съхранявате на две места поради денормализиране, поставено там от съображения за производителност.
update t
set lname = i.lname
from table2 t
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname
Както можете да видите, това ще актуализира само lnames, които са различни от това, което в момента е в таблицата, която актуализирам.
Ако искате да направите одит и да запишете само онези редове, които са се променили, тогава направете сравнението, като използвате всички полета, нещо като където i.field1 <> d.field1 или i.field2 <> d.field3 (и т.н. през всички полета)