Lad os starte med jeg ville aldrig, og jeg mener aldrig, påberåbe en lagret proc i en trigger. For at tage højde for en indsættelse med flere rækker, skal du markere processen. Dette betyder, at de 200.000 rækker, du lige har indlæst gennem en sæt-baseret forespørgsel (f.eks. opdatering af alle priser med 10%) kan godt låse bordet i timevis, da udløseren tappert forsøger at håndtere belastningen. Plus, hvis noget ændrer sig i processen, kan du bryde alle indsatser til bordet overhovedet eller endda helt hænge bordet op. Jeg er fast overbevist om, at udløserkoden ikke bør kalde noget andet uden for udløseren.
Personligt foretrækker jeg blot at udføre min opgave. Hvis jeg har skrevet de handlinger, jeg vil udføre korrekt i triggeren, vil den kun opdatere, slette eller indsætte, hvor kolonner er ændret.
Eksempel:antag, at du vil opdatere efternavn-feltet, som du gemmer to steder på grund af en denormalisering, der er placeret der af ydeevnemæssige årsager.
update t
set lname = i.lname
from table2 t
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname
Som du kan se, vil det kun opdatere de lnavne, der er anderledes end det, der i øjeblikket er i den tabel, jeg opdaterer.
Hvis du ønsker at foretage revision og kun registrere de rækker, der ændrede sig, så lav sammenligningen ved at bruge alle felter noget lignende hvor i.field1 <> d.field1 eller i.field2 <> d.field3 (osv gennem alle felterne)