Začněme tím, že bych nikdy a myslím nikdy nevyvolal uložený proc ve spoušti. Chcete-li počítat s víceřádkovým vložením, museli byste kurzorem procházet proc. To znamená, že 200 000 řádků, které jste právě načetli pomocí dotazu založeného na množině (řekněme aktualizaci všech cen o 10 %), může dobře uzamknout tabulku na hodiny, protože se spouštěč statečně snaží zvládnout zátěž. Navíc, pokud se něco změní v procesu, můžete rozbít všechny vložky stolu nebo dokonce úplně zavěsit stůl. Pevně věřím, že spouštěcí kód by neměl volat nic jiného než spouštěč.
Osobně dávám přednost jednoduše dělat svůj úkol. Pokud jsem do spouštěče zapsal akce, které chci správně provést, aktualizuje, smaže nebo vloží pouze tam, kde se změnily sloupce.
Příklad:Předpokládejme, že chcete aktualizovat pole last_name, které ukládáte na dvou místech kvůli denormalizaci, která je tam umístěna z důvodu výkonu.
update t
set lname = i.lname
from table2 t
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname
Jak můžete vidět, aktualizovalo by se pouze jména, která se liší od toho, co je aktuálně v tabulce, kterou aktualizuji.
Pokud chcete provést audit a zaznamenat pouze ty řádky, které se změnily, proveďte srovnání pomocí všech polí něco jako kde i.pole1 <> d.pole1 nebo i.pole2 <> d.pole3 (atd. přes všechna pole)