Está en la página 1de 34

Triggers o 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 una consulta SQL sobre una tabla o vista.
Objetivo del triggers
Los TRIGGERS son una de las funcionalidades más útiles de las
que disponemos cuando diseñamos y mantenemos bases de
datos. Gracias a ellos podremos implementar ciertas
características de nuestra base de datos sin necesidad de
desarrollar programación en otros lenguajes externos.
Ventajas triggers
Las ventajas de los triggers son varias:
1. La entrada en vigor automática de restricciones de los datos, hace
que los
usuarios entren sólo valores válidos.
2. El mantenimiento de la aplicación se reduce, los cambios a un
disparador se
refleja automáticamente en todas las aplicaciones que tienen que ver
con la tabla sin la necesidad de recompilar o enlazar.
Desventajas triggers
• Hay que definir con anticipación la tarea que realizará el trigger
• Peligro de pérdida en Reorganizaciones.
• Un Trigger nunca se llama directamente.
• Los triggers no se desarrollan pensando en un sólo registro, los
mismos
deben funcionar en conjunto con los datos ya que se disparan por
operación
y no por registro.
• Por funcionalidad, no hay que poner en uno solo las funciones de
INSERT,
UPDATE y DELETE.
Diferencia entre triggers, sp y funciones
La principal diferencia entre los triggers y stored procedures: Es que los
triggers son procedimientos que se ejecutan automáticamente, cuando se
produce un evento sobre el que se quiere trabajar. Para esto existen tres
tipos de eventos que pueden disparar un trigger: INSERT, DELETE y
UPDATE.
Y respecto a las funciones se diferencian en que los Triggers hacen lo
anteriormente mencionado, mientras que las Funciones se encarga de
reescribir.
Sintaxis general triggers
la sintaxis es la siguiente:
Sintaxis triggers MySQL
La sintaxis del triggers en Mysql:
Ejemplo triggers en MySQL
En nuestro ejemplo usaremos una tabla llamada productos:
Crear triggers MySQL
Creamos el triggers para nuestro ejemplo:
Listar triggers en MySQL
Para listar los triggers en MySQL se usa el siguiente comando:
Invocar triggers en MySQL

Una vez hayamos creado el trigger, no tendremos que hacer


absolutamente nada para llamarlo, puesto que el motor de la
base de datos lo invocará automáticamente cada vez que se
actualice un registro de la tabla de productos.
Eliminar triggers en MySQL
Para eliminar un trigger usamos el siguiente comando:
Disparadores en PostgreSQL
Momentos de ejecución
●Para que ocurra ANTES de cualquier INSERT,UPDATE ó DELETE
●Para que ocurra DESPUÉS de cualquier INSERT,UPDATE ó DELETE
●Para que se ejecute una sola vez por comando SQL (statement-level trigger)
●Para que se ejecute por cada línea afectada por un comando SQL (row-level trigger)
–Especificaciones para disparar

● BEFORE la operación se intenta en una fila: insertar, actualizar o eliminar;


● AFTER la operación ha finalizado: insertar, actualizar o eliminar;
● INSTEAD OF la operación en el caso de inserciones, actualizaciones o eliminaciones
en una vista.

– Activador que está marcado

● FOR EACH ROW se llama una vez por cada fila que modifica la operación;
● FOR EACH STATEMENT se llama onde para cualquier operación dada.
Definición de disparador sintaxis SQL

Esta es la definición del comando SQL que se puede utilizar para definir un disparador en una tabla.

CREATE TRIGGER nombre { BEFORE | AFTER } { INSERT | UPDATE | DELETE [ OR ... ] }


ON tabla [ FOR [ EACH ] { ROW | STATEMENT } ]

EXECUTE PROCEDURE nombre de funcion ( argumentos )


Características Y Reglas A Seguir
1. El procedimiento almacenado que se vaya a utilizar por el disparador debe de definirse e
instalarse antes de definir el propio disparador.

2. Un procedimiento que se vaya a utilizar por un disparador no puede tener argumentos y tiene que
devolver el tipo "trigger".

3. Un mismo procedimiento almacenado se puede utilizar por múltiples disparadores en diferentes


tablas.

4. Procedimientos almacenados utilizados por disparadores que se ejecutan una sola vez por
comando SQL (statement-level) tienen que devolver siempre NULL.

5. Procedimientos almacenados utilizados por disparadores que se ejecutan una vez per linea
afectada por el comando SQL (row-level) pueden devolver una fila de tabla.
6. Procedimientos almacenados utilizados por disparadores que se ejecutan una vez per fila afectada por el comando SQL (row-level) y ANTES de ejecutar el comando SQL que lo lanzó, pueden:
1.Retornar NULL para saltarse la operación en la fila afectada.
2.Ó devolver una fila de tabla (RECORD)

7. Procedimientos almacenados utilizados por disparadores que se ejecutan DESPUES de ejecutar el comando SQL que lo lanzó, ignoran el valor de retorno, asi que pueden retornar NULL sin problemas.

8. En resumen, independendientemente de como se defina un disparador, el procedimiento almacenado utilizado por dicho disparador tiene que devolver ó bien NULL, ó bien un valor RECORD con la misma estructura que la tabla que lanzó dicho disparador.
9. Si una tabla tiene más de un disparador definido para un mismo evento (INSERT,UPDATE,DELETE), estos se ejecutarán en orden alfabético por el nombre del disparador. En el caso de disparadores del tipo ANTES / row-level, la file retornada por cada disparador, se convierte en la entrada del siguiente. Si
alguno de ellos retorna NULL, la operación será anulada para la fila afectada.

10. Procedimientos almacenados utilizados por disparadores pueden ejecutar sentencias SQL que a su vez pueden activar otros disparadores. Esto se conoce como disparadores en cascada. No existe límite para el número de disparadores que se pueden llamar pero es responsabilidad del programador el evitar
una recursión infinita de llamadas en la que un disparador se llame así mismo de manera recursiva.
Variables Especiales En PL/PgSQL
NEW
Tipo de dato RECORD; Variable que contiene la nueva fila de la tabla para las operaciones INSERT/UPDATE en disparadores del tipo row-level. Esta variable es NULL en disparadores del tipo statement-level.
OLD
Tipo de dato RECORD; Variable que contiene la antigua fila de la tabla para las operaciones UPDATE/DELETE en disparadores del tipo row-level. Esta variable es NULL en disparadores del tipo statement-level.
TG_NAME
Tipo de dato name; variable que contiene el nombre del disparador que está usando la función actualmente.
TG_WHEN
Tipo de dato text; una cadena de texto con el valor BEFORE o AFTER dependiendo de como el disparador que está usando la función actualmente ha sido definido
G_LEVEL
T

Tipo de dato text; una cadena de texto con el valor ROW o STATEMENT dependiendo de como el disparador que está usando la función actualmente ha sido definido
TG_OP
Tipo de dato text; una cadena de texto con el valor INSERT, UPDATE o DELETE dependiendo de la operación que ha activado el disparador que está usando la función actualmente.
TG_RELID
Tipo de dato oid; el identificador de objeto de la tabla que ha activado el disparador que está usando la función actualmente.
TG_RELNAME
Tipo de dato name; el nombre de la tabla que ha activado el disparador que está usando la función actualmente. Esta variable es obsoleta y puede desaparecer en el futuro. Usar TG_TABLE_NAME.
TG_TABLE_NAME
Tipo de dato name; el nombre de la tabla que ha activado el disparador que está usando la función actualmente.
G_TABLE_SCHEMA
T

Tipo de dato name; el nombre de la schema de la tabla que ha activado el disparador que está usando la función actualmente.
TG_NARGS
Tipo de dato integer; el número de argumentos dados al procedimiento en la sentencia CREATE TRIGGER.
TG_ARGV[]
Tipo de dato text array; los argumentos de la sentencia CREATE TRIGGER. El índice empieza a contar desde 0. Indices inválidos (menores que 0 ó mayores/iguales que tg_nargs) resultan en valores nulos.
Crear la función
CREATE FUNCTION nombre_funcion() RETURNS TRIGGER AS $$
BEGIN
Escribimos las sentencias que se vayan a ejecutar.
END;
$$ LANGUAGE plpgsql;
Crear el disparador
CREATE TRIGGER nombre_trigger BEFORE INSERT ON tabla FOR EACH ROW EXECUTE PROCEDURE
nombre _funcion;
Borrar disparador
DROP TRIGGER [ IF EXISTS ] name ON table [ CASCADE | RESTRICT ]

Ejemplo:
DROP TRIGGER if_dist_exists ON films;
Ejemplo disparador en Postgresql
CREATE TABLE company (
id SERIAL PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP,
modified_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE log (


id SERIAL PRIMARY KEY NOT NULL,
table_name TEXT NOT NULL,
table_id TEXT NOT NULL,
description TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
Creación de la función
CREATE OR REPLACE FUNCTION add_created_at_function()

RETURNS trigger AS $BODY$


BEGIN
NEW.created_at := NOW();
RETURN NEW;
END $BODY$
LANGUAGE plpgsql;
Creación del disparador
CREATE TRIGGER add_created_at_trigger
BEFORE INSERT
ON company
FOR EACH ROW
EXECUTE PROCEDURE add_created_at_function();

Probando el disparador
INSERT INTO company (name) VALUES ('My company');
SELECT * FROM company;
Disparador en Oracle

Un desencadenador es un procedimiento almacenado


que Oracle invoca automáticamente cada vez que se
produce un evento especificado.
Sintaxis general de Disparadores en
Oracle
CREATE TRIGGER OR REPLACE <Nombre del Trigger>
ON <Nombre de la Tabla>
AFTER <INSERT,DELETE,UPDATE>
AS
BEGIN
-- Inserta aquí las instrucciones
END
/
Ejemplo de disparadores en Oracle
Tenemos la siguiente tabla productos3 para el ejemplo
Crear Trigger en Oracle
Listar Triggers en Oracle

select trigger_name, trigger_type,


triggering_event, table_name,
status, trigger_body
from ALL_TRIGGERS
Invocar Trigger en Oracle

Una vez hayamos creado el trigger, no tendremos que hacer


absolutamente nada para llamarlo, puesto que el motor de la
base de datos lo invocará automáticamente cada vez que se
actualice un registro de la tabla de productos.
Eliminar Trigger en Oracle

DROP TRIGGER trigger_name;

También podría gustarte