Triggers / Disparadores en PLSQL

por

en

El servidor de datos admite disparadores de nivel de fila y de declaración dentro de un contexto PL/SQL.

Un activador de nivel de fila (row level trigger) se activa una vez por cada fila afectada por un evento de activación. Por ejemplo, si la eliminación se define como un evento desencadenante para una tabla en particular y una sola instrucción DELETE elimina cinco filas de esa tabla, el trigger se activa cinco veces, una para cada fila.

Un disparador a nivel de instrucción (statement level trigger) se activa solo una vez para cada instrucción. Usando el ejemplo anterior, si la eliminación se define como un evento desencadenante para una tabla en particular, y una sola instrucción DELETE elimina cinco filas de esa tabla, el trigger se activa una vez. La granularidad del disparador a nivel de declaración no se puede especificar para disparadores BEFORE o INSTEAD OF.

Variables en Triggers (PL/SQL)

NEW y OLD son variables especiales que puede usar en los triggers PL/SQL sin definirlas explícitamente.

NEW es un nombre de pseudo-registro que hace referencia a la nueva fila de la tabla para operaciones de inserción (insert) y actualización (update) en triggers a nivel de fila. Su uso es :NEW.nombrecolumna, donde nombrecolumna es el nombre de una columna en la tabla en la que se define el trigger.

Cuando se usa en un trigger a nivel de fila BEFORE, el contenido inicial de :NEW.nombrecolumna es el valor de la columna en la fila nueva que se va a insertar o en la fila que va a reemplazar la fila anterior.

Cuando se usa en un trigger de nivel de fila AFTER, el nuevo valor de columna ya se almacenó en la tabla.
Cuando se activa un trigger mediante una operación DELETE, la columna :NEW.nombrecolumna en ese trigger es nula, ya que estamos haciendo un borrado y la fila lo tendría nuevos valores.

En el bloque de código de activación, :NEW.nombrecolumna se puede utilizar como cualquier otra variable. Si se asigna un valor a :NEW.columna en el bloque de código de un trigger de nivel de fila AFTER, el valor asignado se usa en la fila insertada o actualizada.

OLD es un nombre de pseudo-registro que hace referencia a la fila de la tabla anterior para operaciones de actualización y eliminación en triggers a nivel de fila. Su uso es :OLD.nombrecolumna, donde nombrecolumna es el nombre de una columna en la tabla en la que se define el disparador.

Cuando se usa en un trigger a nivel de fila BEFORE, el contenido inicial de :OLD.nombrecolumna es el valor de la columna en la fila que se eliminará o en la fila anterior que se reemplazará por la fila nueva.
Cuando se usa en un trigger a nivel de fila AFTER, el valor de la columna anterior ya no se almacena en la tabla.
Cuando se activa un trigger mediante una operación INSERT, la columna :OLD.nombrecolumna en ese disparador es nula.

En el bloque de código de activación, :OLD.nombrecolumna se puede utilizar como cualquier otra variable. Si se asigna un valor a :OLD.nombrecolumna en el bloque de código de un disparador de nivel de fila AFTER, el valor asignado no tiene efecto en la acción del disparador.

Predicados de un trigger

Los predicados de un trigger UPDATING, DELETING, and INSERTING solo se pueden usar en un trigger para identificar el evento que activó el desencadenante.

UPDATING
True si el activador se activó mediante una operación de actualización. Falso en caso contrario.
DELETING
True si el activador se activó mediante una operación de eliminación. Falso en caso contrario.
INSERTING
True si el activador se activó mediante una operación de inserción. Falso en caso contrario.

Estos predicados se pueden especificar como una sola condición de búsqueda o como un factor booleano dentro de una condición de búsqueda compleja en una cláusula WHEN o una declaración PL/SQL.

Excepciones y transacciones en triggers (PL/SQL)

Un activador siempre se ejecuta como parte de la misma transacción dentro de la cual se ejecuta la instrucción activadora.

Si no se producen excepciones dentro del bloque de código de activación, los efectos del lenguaje de manipulación de datos (DML) dentro del activador se confirman solo si se confirma la transacción que contiene la declaración de activación. Si la transacción se revierte, los efectos de DML dentro del activador también se revierten.

Una reversión solo puede ocurrir dentro de un bloque atómico o mediante el uso de un controlador UNDO. La instrucción desencadenante en sí misma no se revierte a menos que la aplicación fuerce una reversión de la transacción de encapsulación.

Si ocurre una excepción no controlada dentro del bloque de código de activación, la declaración de llamada se retrotrae.

Sintaxis creación de triggers (PL/SQL)

 CREATE

Especifica que se cree la definición del disparador en el servidor actual.

OR REPLACE

Especifica que se reemplace la definición del disparador si existe uno en el servidor actual. La definición existente se descarta antes de que la nueva definición se reemplace en el catálogo. Esta opción se ignora si no existe una definición para el disparador en el servidor actual.

trigger-name

Nombre el activador. El nombre, incluido el nombre de esquema implícito o explícito, no debe identificar un activador ya descrito en el catálogo.

BEFORE

Especifica que la acción desencadenada asociada debe aplicarse antes de que se apliquen a la base de datos los cambios provocados por la actualización real de la tabla de asunto.

AFTER

Especifica que la acción desencadenada asociada se aplicará después de que los cambios provocados por la actualización real de la tabla de asunto se apliquen a la base de datos.

INSTEAD OF

Especifica que la acción desencadenada asociada reemplaza la acción en la vista del sujeto.

trigger-event

Especifica que la acción activada asociada con el activador se ejecutará cada vez que se aplique uno de los eventos a la tabla de asunto. Se puede especificar cualquier combinación de eventos, pero cada evento (INSERT, DELETE y UPDATE) solo se puede especificar una vez

INSERT

Especifica que la acción activada asociada con el trigger se ejecutará cada vez que se aplique una operación INSERT a la tabla.

DELETE

Especifica que la acción activada asociada con el trigger se ejecutará cada vez que se aplique una operación DELETE a la tabla.

UPDATE

Especifica que la acción activada asociada con el trigger se ejecutará cada vez que se aplique una operación de ACTUALIZACIÓN a la tabla, sujeta a las columnas especificadas o implícitas.

Si no se especifica la lista de nombres de columna opcional, se implican todas las columnas de la tabla. Por lo tanto, la omisión de la lista de nombres de columnas implica que el activador se activará con la actualización de cualquier columna de la tabla.

OF column-name,…

Cada nombre de columna especificado debe ser una columna de la tabla base. Si el activador es un activador BEFORE, el nombre de columna especificado no puede ser una columna generada que no sea la columna de identidad. Ningún nombre de columna puede aparecer más de una vez en la lista de nombres de columna. El activador solo se activará mediante la actualización de una columna que se identifique en la lista de nombres de columna. Esta cláusula no se puede especificar para un activador INSTEAD OF.

ON table-name

Designa la tabla de asuntos de la definición del disparador BEFORE o AFTER. El nombre debe especificar una tabla base o un alias que se resuelva en una tabla base. El nombre no debe especificar una tabla de catálogo, una tabla de consulta materializada, una tabla temporal creada, una tabla temporal declarada o un apodo.

REFERENCING

Especifica los nombres de correlación para las variables de transición. Los nombres de correlación identifican una fila específica en el conjunto de filas afectadas por la operación SQL desencadenante. Cada fila afectada por la operación SQL desencadenante está disponible para la acción desencadenada al calificar columnas con nombres de correlación especificados de la siguiente manera.

OLD AS nombre-correlación
Especifica un nombre de correlación que identifica el estado de la fila antes de la activación de la operación SQL. Si el evento desencadenante es INSERT, los valores de la fila son valores nulos.

NEW AS nombre-correlación

Especifica un nombre de correlación que identifica el estado de fila modificado por la operación SQL desencadenante y por cualquier declaración SET en un desencadenador BEFORE que ya se haya ejecutado. Si el evento desencadenante es DELETE, los valores de la fila son valores nulos.

Si no se invoca la cláusula REFERENCING, las variables desencadenantes NEW y OLD se pueden usar opcionalmente sin definirlas explícitamente.

FOR EACH ROW

Especifica que la acción desencadenada se debe aplicar una vez para cada fila de la tabla de asunto que se ve afectada por la operación SQL desencadenante.

FOR EACH STATEMENT

Especifica que la acción desencadenada se aplicará solo una vez para toda la instrucción.

WHEN

(condición de búsqueda)
Especifica una condición que es verdadera, falsa o desconocida. La condición de búsqueda proporciona la capacidad de determinar si se debe ejecutar o no una determinada acción desencadenada. La acción asociada se realiza solo si la condición de búsqueda especificada se evalúa como verdadera.

declaration

Especifica una declaración de variable.

statement or handler-statement

Especifica una instrucción de programa PL/SQL. El cuerpo del activador puede contener bloques anidados.

condition

Especifica un nombre de condición de excepción, como NO_DATA_FOUND. Sintaxis borrado de triggers (PL/SQL)

DROP TRIGGER trigger-name

Puede eliminar un trigger de la base de datos utilizando la sentencia DROP TRIGGER.

trigger-name: specifica el nombre del activador que se va a descartar.