En Oracle, se puede escribir un trigger a nivel de fila especificando la cláusula FOR EACH ROW
en la declaración CREATE TRIGGER
:Al implementar un desencadenante de nivel de extracto en una tabla, ¿es posible obtener los registros VIEJO y NUEVO para todas las filas afectadas?
CREATE TRIGGER MY_FANCY_TRIGGER
BEFORE UPDATE ON MY_TABLE
FOR EACH ROW
BEGIN
IF :OLD.my_id_column > 4 AND :NEW.some_other_column <> 'foo' THEN
-- ...
END IF;
END;
Tal gatillo le permite ver la antes y después versiones de cada fila afectada (:OLD
y :NEW
respectivamente). Por ejemplo, la siguiente instrucción hará que este disparador para ejecutar una vez para cada fila de MY_TABLE
:
UPDATE MY_TABLE SET some_other_column = 'bar';
Mediante la eliminación de la cláusula FOR EACH ROW
, el gatillo se convierte en un comunicado gatillo -level. Esto significa que solo se ejecutará una vez por declaración, independientemente de cuántas filas (si las hay) se vieron afectadas por la declaración. Lamentablemente, los desencadenadores de nivel de extracto no tienen las variables :OLD
y :NEW
disponibles (porque el número de filas afectadas varía).
¿Es posible obtener los :OLD
y :NEW
valores para todos los filas afectadas dentro de un trigger a nivel de estado de cuenta? Tengo un procesamiento que preferiría que ocurriera una vez por declaración.
¡Guau, los disparadores compuestos se ven maravillosos! –
Excelente punto. Descuidé eso. –
Estoy aceptando esta respuesta como la solución preferida para avanzar. –