Triggers o disparadores

10,032 views

Published on

Published in: Technology
1 Comment
7 Likes
Statistics
Notes
No Downloads
Views
Total views
10,032
On SlideShare
0
From Embeds
0
Number of Embeds
59
Actions
Shares
0
Downloads
468
Comments
1
Likes
7
Embeds 0
No embeds

No notes for slide

Triggers o disparadores

  1. 1. DISPARADORES O TRIGGERS<br />
  2. 2. UN DISPARADOR O TRIGGER es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación.<br />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).<br />
  3. 3. USOS<br />Son usados para mejorar la administración de la Base de datos, sin necesidad de contar con que el usuario ejecute la sentencia de SQL.<br />Además, pueden generar valores de columnas, previene errores de datos, sincroniza tablas, modifica valores de una vista, etc.<br />Permite implementar programas basados en paradigma lógico (sistemas expertos, deducción).<br />
  4. 4. VENTAJAS<br />La entrada en vigor automática de restricciones de los datos, hace que los usuarios entren sólo valores válidos.<br />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.<br />
  5. 5. 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.<br />
  6. 6. SINTAXIS GENERAL DE UN DISPARADOR<br />CREATE [OR REPLACE] TRIGGER nombre<br />[temporalidad del evento]<br />[granularidad del evento]<br />[WHEN condición]<br />BEGIN<br />cuerpo del trigger<br />END nombre;<br />
  7. 7. CREATE [OR REPLACE] TRIGGER nombre<br />Crea o reemplaza un disparador con el nombre especificado.<br />[temporalidad del evento]<br />Puede tomar dos valores: BEFORE ó AFTER que indicará si el cuerpo del disparador<br />debe ejecutarse antes o después del evento que causa la activación del disparador.<br />Ambos valores pueden aplicarse tanto para disparadores a nivel de fila como a nivel de<br />orden.<br />
  8. 8. La opción BEFORE/AFTER debe acompañarse de la operación que causa la activacióndel disparador. <br />Estas pueden ser operaciones de inserción (INSERT) Y/O borrado<br />(DELETE) y/o modificación (UPDATE) respecto a una tabla o respecto a una columnade una tabla. Cuando se quiere especificar más operación, estas se pueden unirutilizando los operadores OR y AND.<br />
  9. 9. [ granularidad del evento]<br />[WHEN condición]<br />Permite distinguir si el disparador es a nivel de fila o a nivel de orden. Un disparador<br />se define a nivel de fila cuando el cuerpo del disparador se debe aplicar fila a fila de la<br />tabla afectada y se define a nivel de orden cuando se debe aplicar a toda la tabla a la<br />vez.<br />Si queremos definir el disparador a nivel de fila, la granularidad deberá especificarse<br />con la cláusula FOR EACH ROW a la que habrá que acompañar de la condición que<br />debe cumplir la fila para aplicar el cuerpo del disparador. <br />
  10. 10. Esta condición se indica en la<br />orden SQL mediante la cláusula WHEN condición.<br />Cuando no exista definición del granularidad del evento, significará que el disparador<br />está definido a nivel de orden.<br />
  11. 11. BEGINcuerpo del triggerEND nombre<br />Dentro del cuerpo de un disparador podemos incluir sentencias de borrado (DELETE),<br />inserción (INSERT) o modificación (UPDATE) pero también se puede poner cualquier<br />otra sentencia SQL (SELECT..) <br />
  12. 12. ÓRDENES DE DISPARADORES<br />Eliminación de un disparador<br />DROP TRIGGER nombre;<br />Habilitación/deshabilitación de un disparador<br />ALTER TRIGGER nombre [ENABLE|DISABLE]<br />Habilitación/deshabilitación de todos los disparadores de una tabla:<br />ALTER TABLE nombretabla [ENABLE|DISABLE] ALL TRIGGERS;<br />Ver todos los disparadores definidos por un usuario<br />SELECT TRIGGER_NAME FROM USER_TRIGGERS<br />Ver el cuerpo de un disparador:<br />SELECT TRIGGER_BODY FROM USER_TRIGGERS<br />WHERE TRIGGER_NAME = ‘nombre_disparador’;<br />Ver la descripción de un disparador:<br />SELECT DESCRIPTION FROM USER_TRIGGERS<br />WHERE TRIGGER_NAME = ‘nombre_disparador<br />
  13. 13. Si se quiere hacer mención en la condición WHEN al valor de la fila a borrar, se debe<br />hacer referencia mediante las variables NEW y OLD. Por ejemplo el<br />disparador estaría correctamente definido de la siguiente manera:<br />CREATE TRIGGER nivel_fila_con_condición<br />AFTER DELETE OF salario ON empleado<br />FOR EACH ROW<br />WHEN OLD.salario >60000<br />BEGIN<br />
  14. 14. CREATE TABLE test1(a1 INT);<br />CREATE TABLE test2(a2 INT);<br />CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);<br />CREATE TABLE test4(<br /> a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, <br /> b4 INT DEFAULT 0<br />);<br />DELIMITER |<br />CREATE TRIGGER testref BEFORE INSERT ON test1<br /> FOR EACH ROW BEGIN<br /> INSERT INTO test2 SET a2 = NEW.a1;<br /> DELETE FROM test3 WHERE a3 = NEW.a1; <br /> UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;<br /> END<br />|<br />DELIMITER ;<br />INSERT INTO test3 (a3) VALUES <br /> (NULL), (NULL), (NULL), (NULL), (NULL), <br /> (NULL), (NULL), (NULL), (NULL), (NULL);<br />INSERT INTO test4 (a4) VALUES <br /> (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);<br />INSERT INTO test1 VALUES <br /> (1), (3), (1), (7), (1), (8), (4), (4);<br />Ejemplos:<br />
  15. 15. CREATE TABLE clientes<br />(id int not null auto_increment,<br />nombre varchar(100),<br />seccionvarchar(10),<br />PRIMARY KEY(id),<br />KEY(nombre)) ENGINE = InnoDB;<br />INSERT INTO clientes (nombre, seccion) VALUES<br />('Ivan','administración'),<br />('Susana','jefe de prensa'),<br />('Max','asistente operativo'),<br />('Javier','supervisor');<br />CREATE TABLE auditoria_clientes<br />(id int not null auto_increment,<br />nombre varchar(100),<br />anterior_seccionvarchar(10),<br />usuario varchar(40),<br />modificado datetime,<br />primarykey(id)) ENGINE = InnoDB;<br />CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON clientes<br />FOR EACH ROW<br />INSERT INTO auditoria_clientes(name, anterior_seccion, usuario, modificado )<br />VALUES (OLD.nombre, OLD.seccion, CURRENT_USER(), NOW() );<br />

×