Pregunta

Tengo una tabla que tiene un activador de inserción. Si inserto 6000 registros en esta tabla en una declaración de inserción de un procedimiento almacenado, ¿volverá el procedimiento almacenado antes de que se complete el desencadenador de inserción?

Solo para asegurarme de que estoy pensando correctamente, el disparador solo debería llamarse (sé que 'llamado' no es la palabra correcta) una vez porque solo había 1 instrucción de inserción, ¿verdad?

Mi pregunta principal es: ¿finalizará el sproc incluso si el disparador no se ha completado?

¿Fue útil?

Solución

Su activador de inserción se ejecutará una vez para toda la instrucción de inserción. Es por eso que es importante usar la tabla temporal insertado para ver qué se ha insertado realmente, y no solo seleccionar el registro individual más reciente, o algo así.

Acabo de probar un desencadenador de inserción y actualización y, de hecho, el servidor sql los considera parte de la inserción. el proceso no finalizará hasta que finalice el disparador.

Otros consejos

Los desencadenantes son parte de la transacción que los llamó.

Una cosa importante sobre los desencadenantes que debe tener en cuenta es que el disparador se dispara una vez para cada transacción (al menos en el servidor SQL, debe verificar otros dbs, pero incluso si procesará fila por fila, eso suele ser un mala idea), por lo que si inserta 6000 registros, el disparador se dispara una vez, no 6000 veces. Muchas personas no son conscientes de esto y escriben disparadores como si procesaran múltiples inserciones de registros un registro a la vez. Esto no es cierto y su activador debe tener en cuenta la entrega de la inserción de múltiples registros.

La llamada de activación no es asíncrona. Cada llamada a su procedimiento de inserción dará como resultado que se active el disparador, y el procedimiento no volverá hasta que finalice el disparador.

Eche un vistazo al plan de consulta para ver cómo funciona. Verá que se invocarán las declaraciones en el activador para cada llamada al procedimiento.

La cuestión es que, cada vez que se cumplen los criterios de TRIGGER, se activa TRIGGER. Se dispara una vez en el procesamiento por lotes o transacción. Vea mi lección 101 en GATILLO

Debe usar el cursor en la instrucción de inserción para procesar la fila de activación. Porque los disparadores en SQL Server se disparan una vez por declaración, no una vez por fila.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top