TRIGGER (DISPARADORES).
Un disparador o trigger es una funcionalidad que la base de datos ejecuta de forma
automática cuando se realiza una operación de tipo Insert, Update o Delete en una tabla o
vista, o cuando se ejecuta en una consulta SQL sobre una tabla o vista.
Esto nos permite realizar acciones cuando se realiza un a inserción, modificación o
eliminación de un registro. Dicha función se plasma mediante una función, la cual se llama
función disparadora, que se ejecuta cada vez que PostgreSQL actúa sobre una fila
(disparador de fila o de tipo for each row) o una única vez por sentencia SQL (disparador
de secuencia de tipo fr each statement).
Para la creación de un disparador o trigger se realizan dos pasos:
Primero se crea la función disparadora.
Después se crea el disparador SQL con el comando créate trigger al que
introduciremos los parámetros para ejecutar la función disparadora creada en el
paso anterior.
Sintaxis para crear un Disparador (trigger):
CREATE [OR REPLACE] TRIGGER nombre_trigger
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON tabla
[REFERENCING OLD AS alias_antiguo NEW AS alias_nuevo]
[FOR EACH ROW]
WHEN (condición)
BEGIN
Sentencias SQL
END;
/
Estructura de un Disparador (trigger):
CREATE [OR REPLACE] TRIGGER: Esta es la declaración inicial que indica
que estás creando un trigger. Puedes usar OR REPLACE para reemplazar un
trigger existente con el mismo nombre si ya existe.
nombre_trigger: Es el nombre que le das al trigger.
{BEFORE | AFTER | INSTEAD OF}: Indica cuándo debe ejecutarse el trigger.
BEFORE: Antes de que ocurra la acción (INSERT, UPDATE o DELETE).
AFTER: Después de que ocurre la acción.
INSTEAD OF: En lugar de la acción (solo para vistas).
{INSERT | UPDATE | DELETE} ON tabla: Especifica la acción que activará el
trigger y en qué tabla se aplicará.
REFERENCING OLD AS alias_antiguo NEW AS alias_nuevo: Opcionalmente,
puedes usar estos alias para referirte a las versiones antiguas (OLD) y nuevas
(NEW) de las filas afectadas por un trigger AFTER o INSTEAD OF.
FOR EACH ROW: Esta cláusula especifica que el trigger se dispara una vez por
cada fila afectada por la operación (INSERT, UPDATE o DELETE)
WHEN (condición): Opcionalmente, puedes especificar una condición que debe
cumplirse para que el trigger se ejecute. Esto es comúnmente usado en triggers
BEFORE.
BEGIN ... END: Aquí es donde colocas las sentencias SQL que deseas ejecutar
cuando el trigger se activa. Esto puede incluir consultas, actualizaciones,
inserciones u otras operaciones SQL válidas.
/: Marca el final del bloque de código del trigger.
Como se ejecuta un Disparador (trigger):
La ejecución del disparador puede ser antes (before) o después (after) de llevar a cabo la
sentencia disparadora. Es posible especificar condiciones adicionales para la ejecución del
disparador.
Dado que una sentencia disparadora puede afectar una o más filas de una tabla, es necesario
especificar si se quiere que el disparador se ejecute para cada una de las filas afectadas o
para el bloque en general.
Existen varios tipos de disparadores, dependiendo del tipo de transacción de disparo y el
nivel en el que se ejecuta el disparador (trigger):
1.- Disparadores de nivel de fila: se ejecutan una vez para cada fila afectada por una
instrucción DML. Los disparadores de nivel de fila se crean utilizando la cláusula for each
row en el comando créate trigger.
2.- Disparadores de nivel de instrucción: se ejecutan una vez para cada intrucción DML.
Por ejemplo, si una única intrucción INSERT inserta 500 filas en una tabla un disparador de
nivel de instrucción para dicha tabla sólo se ejecutará una vez. Los disparadores de nivel de
instrucción son el tipo predeterminado que se crea con el comando create trigger.
3.- Disparadores Before y After: puesto que los disparadores son ejecutados por sucesos,
puede establecerse que se produzcan inmediatamente antes (before) o después (after) de
dichos sucesos.
4.- Disparadores Instead Of: puede utilizar INSTEAD OF para indicar a Oracle lo que
tiene que hacer en lugar de realizar las acciones que invoca el disparador. Por ejemplo,
podría usar un disparador INSTEAD OF en una vista para gestionar las inserciones en una
tabla o para actualizar múltiples tablas que son parte de una vista.
5.- Disparadores de esquema: puede crear disparadores sobre operaciones en el nivel de
esquema tales como create table, alter table, drop table, audit, rename, truncate y revoke.
Puede incluso crear disparadores para impedir que los usuarios eliminen sus propias tablas.
En su mayor parte, los disparadores de nivel de esquema proporcionan dos capacidades:
impedir operaciones DDL y proporcionar una seguridad adicional que controle las
operaciones DDL cuando éstar se producen.
6.- Disparadores en nivel de base de datos: puede crear disparadores que se activen al
producirse sucesos de la base de datos, incluyendo errores, inicios de sesión, conexiones y
desconexiones.