Inicio > MYSQL > Triggers

TRIGGERS

24/11/2017MYSQL

 

En MYSQL también se permite el manejo de TRIGGERS ("disparador") como en ORACLE y la verdad es que resulta bastante sencillo. Su código no es nada complejo si se tienen nociones de programación, y es bastante intuitivo.
Los TRIGGERS se pueden asociar a las transacciones:

  • INSERT
  • UPDATE
  • DELETE
Y se puede asociar el TRIGGER antes o después de la transacción, dependiendo de las necesidades del proyecto. Veamos un código de ejemplo.


DELIMITER $$

CREATE TRIGGER nombre_trigger BEFORE INSERT ON tabla1
FOR EACH ROW BEGIN
INSERT INTO tabla2 SET campo_tabla2 = NEW.campo_tabla1;
DELETE FROM tabla3 WHERE campo_tabla3 = NEW.campo_tabla1;
UPDATE tabla4 SET campo_tabla4 = campo_tabla4 + 1
WHERE campo_tabla4 = NEW.campo_tabla1;
END $$

DELIMITER ;

En ejemplo anterior vemos que temos la palabra DELIMITER $$ que sirve para cambiar el delimitador de sentencias que no sea ";", en este caso se pone $$ porque PHPMyAdmin lo hace sí, pero MySQL admite cualquiera.
Este TRIGGER se ejecutará antes de insertar los valores pasados en el INSERT y realiza varias operaciones bastante sencillitas.
También se puede elegir cuando hacer que se ejecute el TRIGGER, si antes de la transacción poniendo BEFORE, o después poniendo AFTER. En el ejemplo que he puesto el TRIGGER se ejecutará antes de la inserción de datos en la tabla.
En el ejemplo que he puesto antes se puede apreciar que aparece la palabra NEW que se refiere al nuevo valor del campo después de la transacción que hace que el TRIGGER se ejecute, si se quiere hacer referencia al valor antiguo es tan sencillo como usar la palabra OLD que asumirá el valor que estaba antes de realizar la transacción.
Los INSERT permiten NEW, los DELETE sólo OLD y los UPDATE ambas. Ésto es algo bastante importante y a tener en cuenta.

Creo que los TRIGGERS son bastante útiles y pueden ahorrar bastante programación.
En los proyectos en los que he participado nunca ha hecho falta añadir TRIGGERS y creo que si que se debería tener en más en cuenta.