2012-04-16 16 views
10

¿Una instrucción de inserción en una tabla que tiene un desencadenante "INSTEAD OF" provocará un ciclo infinito de ejecuciones "en su lugar, insertar"?EN LUGAR DE TRIGGER, ¿Brincaría infinitamente?

Por ejemplo esto:

CREATE TRIGGER setDescToUpper ON part_numbers 
INSTEAD OF INSERT 

AS 
BEGIN 
    INSERT INTO part_numbers (
     colA, 
     colB, 
     part_description 
    ) SELECT 
     colA, 
     colB, 
     UPPER(part_description) 
    ) FROM 
     INSERTED 
END 
GO 

¿La instrucción de inserción dentro de la "en lugar de" gatillo causar un bucle?

No quiero deshabilitar desencadenantes recursivos.

¿Debo desactivar temporalmente el disparador?

Fuente: SQL Server - after insert trigger - update another column in the same table

Respuesta

14

este inserto no se volverá a invocar el gatillo.

El Servidor SQL no invocará los desencadenadores INSTEAD OF de manera recursiva, exactamente por el motivo por el que aparece.

+3

+1 A la derecha, es un gatillo INSTEAD OF. [MSDN dice] (http://msdn.microsoft.com/en-us/library/ms189799.aspx): "Si un desencadenador INSTEAD OF definido en una tabla ejecuta una instrucción contra la tabla que normalmente activaría el disparador INSTEAD OF de nuevo, el desencadenador no se llama recursivamente. En su lugar, la declaración se procesa como si la tabla no tuviera un gatillo INSTEAD OF e inicia la cadena de operaciones de restricción y DESPUÉS de las ejecuciones de los disparos ". – Andomar

+0

¿Podría explicar qué pasaría entonces en este escenario con una instrucción INSERT? ¿Se ejecutará INSERTAR dentro del desencadenador? –

+0

Gracias chicos. Célebre. – zunetastic