Zacznijmy od tego, że nigdy i to znaczy nigdy nie wywoływać przechowywanego proc w wyzwalaczu. Aby uwzględnić wstawianie wielorzędowe, musiałbyś przejrzeć procedurę. Oznacza to, że 200 000 wierszy, które właśnie załadowałeś za pomocą zapytania opartego na zestawie (powiedzmy, że aktualizujesz wszystkie ceny o 10%) może blokować tabelę na wiele godzin, ponieważ wyzwalacz odważnie próbuje obsłużyć obciążenie. Dodatkowo, jeśli coś zmieni się w proc, możesz w ogóle złamać wszelkie wstawki do stołu lub nawet całkowicie zawiesić stół. Mocno wierzę, że kod wyzwalacza nie powinien wywoływać niczego poza wyzwalaczem.
Osobiście wolę po prostu wykonywać swoje zadanie. Jeśli zapisałem akcje, które chcę wykonać poprawnie w wyzwalaczu, zaktualizuje się, usunie lub wstawi tylko te, które uległy zmianie.
Przykład:załóżmy, że chcesz zaktualizować pole nazwisko, które przechowujesz w dwóch miejscach z powodu umieszczonej tam denormalizacji ze względu na wydajność.
update t
set lname = i.lname
from table2 t
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname
Jak widać, zaktualizowałby tylko nazwy, które są inne niż te, które są obecnie w aktualizowanej tabeli.
Jeśli chcesz przeprowadzić audyt i zapisać tylko te wiersze, które uległy zmianie, wykonaj porównanie, używając wszystkich pól, na przykład gdzie i.field1 <> d.field1 lub i.field2 <> d.field3 (itd. przez wszystkie pola)