2008-10-16 26 views
23

Tengo una tabla que tiene un disparador insertado en ella. Si inserto en 6000 registros en esta tabla en una instrucción de inserción de un procedimiento almacenado, ¿regresará el procedimiento almacenado antes de que se complete el disparador de inserción?¿Los disparadores Sql son síncronos o asíncronos?

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

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

Respuesta

19

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 inserted para ver qué se ha insertado realmente, y no solo seleccionar el registro individual más reciente, o algo así.

Acabo de probar un disparador de inserción y actualización y, de hecho, se consideran parte de la inserción por el servidor sql. el proceso no terminará hasta que el gatillo termine.

+1

Gracias por mencionar esto. Me olvidé de eso, e hice exactamente lo que no debería hacer en una situación similar con un disparador que estoy a punto de implementar. Recién lo reescribí para manejar todo el conjunto insertado en lugar de la identificación más reciente. ¡Eek! Pudo haber sido un gran error. ;) –

+0

¡Hola, me alegro de poder ayudar! –

1

La llamada de activación no es asincrónica. Cada llamada a su procedimiento de inserción dará como resultado el disparo del activador, y el procedimiento no volverá hasta que finalice el desencadenador.

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

6

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

Una cosa importante acerca de los desencadenantes que debe tener en cuenta es que el desencadenador se dispara una vez por cada transacción (al menos en el servidor SQl, debe comprobar otros dbs, pero incluso si se procesa fila a fila, generalmente una mala idea), así que si insertas 6000 registros, el gatillo se dispara una vez, no 6000 veces. Muchas personas no son conscientes de esto y escriben desencadenantes como si procesaran múltiples inserciones de registro un registro a la vez. Esto no es cierto y su desencadenante debe dar cuenta de la entrega de la inserción de múltiples registros.

+1

Esto depende de la definición del disparador. En Oracle, por ejemplo, podemos exigir la ejecución del disparador para cada fila con la cláusula FOR EACH ROW. http://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm#431 –

1

El problema es que cada vez que se cumplen los criterios de TRIGGER, el GATILLO se dispara. Dispara una vez en procesamiento por lotes o transacción. Consulte mi lesson 101 en TRIGGER

-1

Debe usar el cursor en la instrucción insert para procesar la fila de activación. Porque los desencadenadores en SQL Server se activan una vez por instrucción, no una vez por fila.

+0

No hay ninguna circunstancia en la que deba usar un cursor en un disparador de servidor sql. Usted necesita escribir cursores para preservar la integridad y ejecutarlos lo más rápido posible. Mientras que un cursor puede hacer lo primero, al final falla rotundamente. Debe usar el procesamiento basado en conjuntos. No quiero bloquear mi mesa durante horas mientras procesa a través de un cursor algo que puede tomar segundos o milisegundos. Eliminamos una que pasó de 45 minutos para procesar 40,000 registros a 40 segundos. Es irresponsable usar un cursor en un disparador. – HLGEM

Cuestiones relacionadas