まず、トリガーでストアドプロシージャを呼び出さないことから始めましょう。複数行の挿入を説明するには、procをカーソルで移動する必要があります。これは、セットベースのクエリ(たとえば、すべての価格を10%更新する)でロードした200,000行は、トリガーがロードを処理しようと勇敢に試みるため、テーブルを何時間もロックする可能性があることを意味します。さらに、procで何かが変更された場合、テーブルへの挿入を完全に壊したり、テーブルを完全にハングアップさせたりする可能性があります。私は、トリガーコードがトリガー以外の何も呼び出さないことを固く信じています。
個人的には、単に自分の仕事をすることを好みます。トリガーで適切に実行したいアクションを記述した場合、列が変更された場所でのみ更新、削除、または挿入されます。
例:パフォーマンス上の理由で非正規化が行われたために、2つの場所に格納しているlast_nameフィールドを更新するとします。
update t
set lname = i.lname
from table2 t
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname
ご覧のとおり、現在更新しているテーブルにあるものとは異なるlnameのみが更新されます。
監査を実行し、変更された行のみを記録する場合は、i.field1<>d.field1またはi.field2<>d.field3(すべてのフィールドなど)
のようなすべてのフィールドを使用して比較を行います。