2012-04-16 13 views
42

Tengo dificultades para comprender la diferencia entre los "desencadenantes de nivel de fila" y los "desencadenantes de nivel de instrucción".desencadenante de nivel de fila frente a desencadenante de nivel de instrucción

Según mi entender, en el escenario donde se crea un desencadenante de nivel de extracto, se puede modificar toda la tabla. Un disparador de nivel de fila solo me permitiría modificar la tupla que está siendo afectada por el evento específico del disparador.

Es esto correcto? ¿Alguien tiene un ejemplo de los dos?

Gracias!

Respuesta

67

La principal diferencia no es lo que puede ser modificado por el disparador, eso depende del DBMS. Un desencadenante (fila o nivel de declaración) puede modificar una o varias filas, de la misma u otras tablas también y puede tener efectos de cascada (desencadenar otras acciones/desencadenantes) pero todo depende del DBMS, por supuesto.

La principal diferencia es cuántas veces se activa el activador. Imagine que tiene una tabla de filas 1 M y se ejecuta:

UPDATE t 
SET columnX = columnX + 1 

Un trigger a nivel de declaración se activará una vez (e incluso si no se actualizan filas). Un activador de nivel de fila se activará un millón de veces, una vez por cada fila actualizada.


Otra diferencia es el orden o la activación. Por ejemplo, en Oracle se activarán los 4 tipos diferentes de factores desencadenantes en el siguiente orden:

Before the triggering statement executes 
Before each row that the triggering statement affects 
After each row that the triggering statement affects 
After the triggering statement executes 

En el ejemplo anterior, tendríamos algo como:

Before statement-level trigger executes 

    Before row-level trigger executes 
    One row is updated 
    After row-level trigger executes 

    Before row-level trigger executes 
    Second row is updated 
    After row-level trigger executes 

    ... 

    Before row-level trigger executes 
    Millionth row is updated 
    After row-level trigger executes 

After statement-level trigger executes 
+0

Entonces, ¿un disparador de nivel de extracto podría modificar una fila, mientras que un nivel de fila podría modificar cada fila en la tabla? –

+2

No, un desencadenador de nivel de fila se puede usar para actualizar/eliminar/insertar muchas filas también. O filas en otras tablas. –

+1

Y un desencadenante de nivel de extracto también. –

17

Es posible que desee una acción de disparo para ejecute una vez que el cliente ejecute una instrucción que modifique un millón de filas (activador de nivel de estado de cuenta). O bien, es posible que desee activar la acción una vez por cada fila que se modifique (activador a nivel de fila).

EJEMPLO: Digamos que tienes un gatillo que asegurará que todos los estudiantes de último año de secundaria se gradúen. Es decir, cuando la calificación de un senior es 12 y la aumentamos a 13, queremos establecer la calificación en NULL.

Para un desencadenante de nivel de extracto, diría, después de ejecutar el enunciado de grado de aumento, la tabla completa una vez para actualizar cualquier ahoras con grado 13 a NULL.

Para un trigger a nivel de fila, se diría, después de cada fila que se ha actualizado, actualizar la calificación de la nueva fila a NULL si es 13.

Un trigger a nivel de declaración se vería así:

create trigger stmt_level_trigger 
after update on Highschooler 
begin 
    update Highschooler 
    set grade = NULL 
    where grade = 13; 
end; 

y un disparador a nivel de fila se vería así:

create trigger row_level_trigger 
after update on Highschooler 
for each row 
when New.grade = 13 
begin 
    update Highschooler 
    set grade = NULL 
    where New.ID = Highschooler.ID; 
end; 

Tenga en cuenta que SQLite no es compatible con disparadores de nivel de declaración, por lo que en SQLite, el FOR EACH ROW es opcional.

0

nivel de los estados de activación es sólo una vez por fila instrucción DML gatillo leval es para cada fila de instrucciones DML

0

si desea ejecutar la instrucción cuando el número de filas se modifican, entonces puede ser posible gracias a los desencadenados comunicado. . viseversa ... cuando desee ejecutar su extracto de cada modificación en su número de filas, deberá ir a los activadores de nivel de fila ...

por ejemplo: los desencadenantes de nivel de extracto funcionan cuando la tabla se modifica..entonces se efectúa más cantidad de registros. y nivel de fila desencadena obras para updation cuando cada fila o modificación ..

1

La principal diferencia entre el nivel de disparo es comunicado a continuación:

comunicado nivel de activación: en función del nombre funciona si se ejecuta ninguna declaración. No depende de cuántas filas o filas se hayan realizado. Se ejecuta solo una vez. Exp: si desea actualizar el salario de cada empleado del departamento de recursos humanos y al final desea saber cuántas filas se efectúan significa cuántos han aumentado el salario y luego utilizar el desencadenante de nivel de extracto. tenga en cuenta que el desencadenador se ejecutará incluso si se actualizan cero filas porque se llama al desencadenante de nivel de instrucción si se ha ejecutado alguna instrucción. No importa si está afectando las filas o no.

Disparador de nivel de fila: se ejecuta cada vez que se ve afectada una fila. si cero filas afectadas. no se ejecutará el desencadenante de nivel de fila. Supongamos que desea eliminar un employye de la tabla emp cuyo departamento es HR y desea tan pronto como el empleado borre de la tabla emp la cuenta en la tabla de departamento desde la sección de RR. HH. 1.entonces debes optar por el disparador de nivel de fila.

Cuestiones relacionadas