Triggers o Dis Par Adores
Triggers o Dis Par Adores
Triggers o Dis Par Adores
Es una rutina autnoma asociada con una tabla o vista que automticamente realiza una accin cuando una fila en la tabla o la vista se inserta (INSERT), se actualiza (UPDATE), o borra (DELETE). Un Disparador nunca se llama directamente, en cambio, cuando una aplicacin o usuario intenta insertar, actualizar, o anular una fila en una tabla, la accin definida en el disparador se ejecuta automticamente (se dispara).
Son usados para mejorar la administracin de la Base de datos, sin necesidad de contar con que el usuario ejecute la sentencia de SQL. Adems, pueden generar valores de columnas, previene errores de datos, sincroniza tablas, modifica valores de una vista, etc. Permite implementar programas basados en paradigma lgico (sistemas expertos, deduccin).
La entrada en vigor automtica de restricciones de los datos, hace que los usuarios entren slo valores vlidos. El mantenimiento de la aplicacin se reduce, los cambios a un disparador se refleja automticamente en todas las aplicaciones que tienen que ver con la tabla sin la necesidad de recompilar.
Los Disparadores tienen dos palabras clave, OLD y NEW que se refieren a los valores que tienen las columnas antes y despus de la modificacin. Los INSERT permiten NEW, los DELETE slo OLD y los UPDATE ambas.
CREATE [OR REPLACE] TRIGGER nombre [temporalidad del evento] [granularidad del evento] [WHEN condicin] BEGIN cuerpo del trigger END nombre;
CREATE [OR REPLACE] TRIGGER nombre Crea o reemplaza un disparador con el nombre especificado. [temporalidad del evento] Puede tomar dos valores: BEFORE AFTER que indicar si el cuerpo del disparador debe ejecutarse antes o despus del evento que causa la activacin del disparador. Ambos valores pueden aplicarse tanto para disparadores a nivel de fila como a nivel de orden.
La opcin BEFORE/AFTER debe acompaarse de la operacin que causa la activacin del disparador. Estas pueden ser operaciones de insercin (INSERT) Y/O borrado (DELETE) y/o modificacin (UPDATE) respecto a una tabla o respecto a una columna de una tabla. Cuando se quiere especificar ms operacin, estas se pueden unir utilizando los operadores OR y AND.
[WHEN condicin] Permite distinguir si el disparador es a nivel de fila o a nivel de orden. Un disparador se define a nivel de fila cuando el cuerpo del disparador se debe aplicar fila a fila de la tabla afectada y se define a nivel de orden cuando se debe aplicar a toda la tabla a la vez. Si queremos definir el disparador a nivel de fila, la granularidad deber especificarse con la clusula FOR EACH ROW a la que habr que acompaar de la condicin que debe cumplir la fila para aplicar el cuerpo del disparador.
Esta condicin se indica en la orden SQL mediante la clusula WHEN condicin. Cuando no exista definicin del granularidad del evento, significar que el disparador est definido a nivel de orden.
Dentro del cuerpo de un disparador podemos incluir sentencias de borrado (DELETE), insercin (INSERT) o modificacin (UPDATE) pero tambin se puede poner cualquier otra sentencia SQL (SELECT..)
Eliminacin de un disparador DROP TRIGGER nombre; Habilitacin/deshabilitacin de un disparador ALTER TRIGGER nombre [ENABLE|DISABLE] Habilitacin/deshabilitacin de todos los disparadores de una tabla: ALTER TABLE nombretabla [ENABLE|DISABLE] ALL TRIGGERS; Ver todos los disparadores definidos por un usuario SELECT TRIGGER_NAME FROM USER_TRIGGERS Ver el cuerpo de un disparador: SELECT TRIGGER_BODY FROM USER_TRIGGERS WHERE TRIGGER_NAME = nombre_disparador; Ver la descripcin de un disparador: SELECT DESCRIPTION FROM USER_TRIGGERS WHERE TRIGGER_NAME = nombre_disparador
Si se quiere hacer mencin en la condicin WHEN al valor de la fila a borrar, se debe hacer referencia mediante las variables NEW y OLD. Por ejemplo el disparador estara correctamente definido de la siguiente manera: CREATE TRIGGER nivel_fila_con_condicin AFTER DELETE OF salario ON empleado FOR EACH ROW WHEN OLD.salario >60000 BEGIN
CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ); DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END | DELIMITER ; INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0); INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);
CREATE TABLE clientes (id int not null auto_increment, nombre varchar(100), seccion varchar(10), PRIMARY KEY(id), KEY(nombre)) ENGINE = InnoDB; INSERT INTO clientes (nombre, seccion) VALUES ('Ivan','administracin'), ('Susana','jefe de prensa'), ('Max','asistente operativo'), ('Javier','supervisor'); CREATE TABLE auditoria_clientes (id int not null auto_increment, nombre varchar(100), anterior_seccion varchar(10), usuario varchar(40), modificado datetime, primary key(id)) ENGINE = InnoDB; CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON clientes FOR EACH ROW INSERT INTO auditoria_clientes(name, anterior_seccion, usuario, modificado ) VALUES (OLD.nombre, OLD.seccion, CURRENT_USER(), NOW() );