2012-01-23 14 views
7

EDITAR: No sé qué distribución es, está en una hoja de examen.SQL: La declaración desencadena VS para cada fila

No estoy recibiendo esto, por desgracia. Estoy bastante contento con los desencadenadores de nivel de Fila, pero ¿podría alguien explicarme cómo diferirían los resultados si el activador fuera el nivel de declaración en su lugar?

Relación/Declaración de activación/fila nivel de disparo

Employee(ID VARCHAR2(30), Salary NUMBER) 


Create Trigger AutoRaise 
After insert on Employee 
Referencing new table as NT 
update Employee 
Set salary = salary + (select avg(salary) from NT) 


Create trigger AutoRaise 
After insert on Employee 
Referencing new table as NT 
For each Row 
Update employee 
Set salary = salary + (select avg(salary) from NT) 

entiendo que en el gatillo para cada fila que va a disparar para cada fila afectada por la declaración del activador. Ahora, ¿el nivel de declaración desencadenar modifica los resultados de manera diferente? Digamos que si insertara cinco tuplas en una declaración, ¿establecería el salario, etc. para todas ellas? Si es así, ¿cuál es el beneficio del desencadenante de nivel de fila aquí?

He intentado buscar pero no puedo entenderlo.

Gracias,

EDIT: Ahora, sólo estoy siendo densa sino que sea gatillo producir diferentes salidas? Para el gatillo nivel de sentencia si usara los valores de ejemplo:

En la tabla antes de la creación del gatillo:

(A,50) 

añadió en una declaración después de que se crea el gatillo:

(B,70), (C,30) 

El primer disparador fijaría el salario para cada tupla que se inserta, sin duda? Entonces, el primero se convertiría en 120 (como el promedio es 50, 70 + 50 = 120) y el segundo se convertiría en 80. Si esto es cierto, ¿cómo difiere el segundo disparador en los resultados?

+2

** ¿QUÉ ** sistema de base de datos y de qué versión estás hablando? ** SQL ** es solo el lenguaje de consulta estructurado, un lenguaje utilizado por muchos sistemas de bases de datos. SQL es ** NO ** un producto de base de datos ... este tipo de cosas suele ser específico del proveedor, por lo que realmente necesitamos saber qué sistema de base de datos de la que está hablando ... –

+0

VARCHAR2 parece indicar que es Oracle. Sin embargo, la sintaxis no es válida porque no existe la referencia a una tabla nueva como ... 'y también falta el inicio/finalización. –

+0

Desafortunadamente esto es de un documento de examen anterior por lo que no se menciona ninguna distribución específica. –

Respuesta

4

La diferencia es que en caso de gatillo nivel de los estados SELECT avg(salary) FROM NT volverá promedio de salario de filas insertadas, pero en caso de nivel de fila, avg(salary) siempre es igual a salary del nuevo disco (trigger ejecutada para cada fila individual). Además, el disparador de nivel de extracto se ejecutará si no hay registros afectados. En caso de activación de nivel de fila, la mayoría de los RDMS no se activan cuando 0 registros están afectados.

Nota al margen. Creo que los cuerpos desencadenantes en la pregunta se dan solo por ejemplo; de lo contrario, recomendaría no utilizar la recursividad en los desencadenadores, incluso si un RDMS determinado tiene dicha opción.

+0

Hola, gracias por la respuesta. Ahora, solo estoy siendo denso, pero ¿dispararía producir diferentes productos?Para el gatillo nivel de sentencia si usara los valores de ejemplo: En la tabla antes de la creación del gatillo: '(A, 50)' añadió en una declaración después de que se crea el gatillo: '(B, 70), (C, 30) ' ¿El primer disparador establecería el salario para cada tupla que se inserta, seguramente? Entonces, el primero se convertiría en 120 (como el promedio es 50, 70 + 50 = 120) y el segundo se convertiría en 80. Si esto es cierto, ¿cómo difiere el segundo disparador en los resultados? –

+1

Para el segundo disparador (nivel de fila) será diferente: 1ra fila (B, 70) insertada: 70 + avg (70) = 140. Segunda fila insertada (30): 1ra fila (140 +30) = 170, segunda 30 + 30 = 60. El activador de fila se ejecutará dos veces, por cada fila 'NEW_TABLE' tendrá 1 registro. – a1ex07

+0

Además, es muy probable que en el caso de un desencadenante de nivel de fila, obtenga un error (o necesite agregar alguna lógica que maneje el nivel de recursión si RDMS permite la recursión en el desencadenador) porque intenta modificar la misma tabla. – a1ex07

Cuestiones relacionadas