Comencemos con nunca y me refiero a nunca invocar un proceso almacenado en un disparador. Para tener en cuenta una inserción de varias filas, tendría que pasar el cursor por el proceso. Esto significa que las 200 000 filas que acaba de cargar a través de una consulta basada en conjuntos (por ejemplo, actualizar todos los precios en un 10 %) podrían bloquear la tabla durante horas mientras el disparador intenta manejar la carga con valentía. Además, si algo cambia en el proceso, podría romper cualquier inserción en la mesa o incluso colgar la mesa por completo. Soy un firme creyente de que el código de disparo no debe llamar a nada más fuera del disparador.
Personalmente prefiero simplemente hacer mi tarea. Si he escrito las acciones que quiero realizar correctamente en el disparador, solo se actualizará, eliminará o insertará donde hayan cambiado las columnas.
Ejemplo:suponga que desea actualizar el campo last_name que está almacenando en dos lugares debido a una desnormalización colocada allí por motivos de rendimiento.
update t
set lname = i.lname
from table2 t
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname
Como puede ver, solo actualizaría los nombres que son diferentes a los que están actualmente en la tabla que estoy actualizando.
Si desea realizar una auditoría y registrar solo las filas que cambiaron, haga la comparación usando todos los campos, algo así como i.field1 <> d.field1 o i.field2 <> d.field3 (etc. a través de todos los campos)