triggers o disparadores

15
DISPARADORES O TRIGGERS

Upload: pablo-jose

Post on 13-Jun-2015

6.930 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Triggers o disparadores

DISPARADORES O TRIGGERS

Page 2: Triggers o disparadores

UN DISPARADOR O TRIGGER es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación.

Es una rutina autónoma asociada con una tabla o vista que automáticamente realiza una acción 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 aplicación o usuario intenta insertar, actualizar, o anular una fila en una tabla, la acción definida en el disparador se ejecuta automáticamente (se dispara).

Page 3: Triggers o disparadores

USOSSon usados para mejorar la administración de la Base de datos, sin necesidad de contar con que el usuario ejecute la sentencia de SQL.

Además, pueden generar valores de columnas, previene errores de datos, sincroniza tablas, modifica valores de una vista, etc.

Permite implementar programas basados en paradigma lógico (sistemas expertos, deducción).

Page 4: Triggers o disparadores

VENTAJASLa entrada en vigor automática de restricciones de los datos, hace que los usuarios entren sólo valores válidos.

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.

Page 5: Triggers o disparadores

Los Disparadores tienen dos palabras clave, OLD y NEW que se refieren a los valores que tienen las columnas antes y después de la modificación.  Los INSERT permiten NEW, los DELETE sólo OLD y los UPDATE ambas.

Page 6: Triggers o disparadores

SINTAXIS GENERAL DE UN DISPARADOR

CREATE [OR REPLACE] TRIGGER nombre[temporalidad del evento][granularidad del evento][WHEN condición]BEGINcuerpo del triggerEND nombre;

Page 7: Triggers o disparadores

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 después del evento que causa la activación del disparador.

Ambos valores pueden aplicarse tanto para disparadores a nivel de fila como a nivel de

orden.

Page 8: Triggers o disparadores

La opción BEFORE/AFTER debe acompañarse de la operación que causa la activación del disparador.

Estas pueden ser operaciones de inserción (INSERT) Y/O borrado

(DELETE) y/o modificación (UPDATE) respecto a una tabla o respecto a una columna de una tabla. Cuando se quiere especificar más operación, estas se pueden unir utilizando los operadores OR y AND.

Page 9: Triggers o disparadores

[ granularidad del evento]

[WHEN condición]

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 cláusula FOR EACH ROW a la que habrá que acompañar de la condición que

debe cumplir la fila para aplicar el cuerpo del disparador.

Page 10: Triggers o disparadores

Esta condición se indica en la

orden SQL mediante la cláusula WHEN condición.

Cuando no exista definición del granularidad del evento, significará que el disparador

está definido a nivel de orden.

Page 11: Triggers o disparadores

BEGINcuerpo del triggerEND nombre

Dentro del cuerpo de un disparador podemos incluir sentencias de borrado (DELETE),

inserción (INSERT) o modificación (UPDATE) pero también se puede poner cualquier

otra sentencia SQL (SELECT..)

Page 12: Triggers o disparadores

ÓRDENES DE DISPARADORESEliminación de un disparador

DROP TRIGGER nombre;

Habilitación/deshabilitación de un disparador

ALTER TRIGGER nombre [ENABLE|DISABLE]

Habilitación/deshabilitación 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 descripción de un disparador:

SELECT DESCRIPTION FROM USER_TRIGGERS

WHERE TRIGGER_NAME = ‘nombre_disparador

Page 13: Triggers o disparadores

Si se quiere hacer mención en la condición WHEN al valor de la fila a borrar, se debe

hacer referencia mediante las variables NEW y OLD. Por ejemplo el

disparador estaría correctamente definido de la siguiente manera:

CREATE TRIGGER nivel_fila_con_condición

AFTER DELETE OF salario ON empleado

FOR EACH ROW

WHEN OLD.salario >60000

BEGIN

Page 14: Triggers o disparadores

Ejemplos: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);

Page 15: Triggers o disparadores

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','administración'),('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 clientesFOR EACH ROWINSERT INTO auditoria_clientes(name, anterior_seccion, usuario, modificado )VALUES (OLD.nombre, OLD.seccion, CURRENT_USER(), NOW() );