Bases de Datos, MySQL

TRIGGERS EN MYSQL

«A partir de MySQL 5.0.2 se incorporó el soporte básico para disparadores (triggers). Un disparador es un objeto con nombre dentro de una base de datos el cual se asocia con una tabla y se activa cuando ocurre en ésta un evento en particular.» http://dev.mysql.com/doc/refman/5.0/es/triggers.html

La definición anterior, nos indica que un Trigger se ejecutara automáticamente cuando ocurra algún evento como son: INSERT, UPDATE, DELETE, estos eventos pueden ocurrir BEFORE y AFTER de ocurrir el evento.

Ahora bien, nosotros podemos hacer referencia a los campos de la tabla sobre la que se ejecuta el Trigger, mediante NEW y OLD. Por ejemplo en un INSERT INTO, NEW es el «nuevo» valor que se inserto o esta por insertarse, pero en una clausula INSERT INTO, el OLD NO EXISTE… esto es obvio ya que al ser un valor de INSERSION sobre un registro, no podemos hablar de un valor «anterior» a la insersión. Caso contrario a lo que tenemos en una sentencia UPDATE, en la cual si podemos referenciar un valor OLD y NEW, pues al actualizar un registro, tenemos un valor anterior a la actualización (OLD) y un valor posterior a la actualización (NEW).

Lo anterior es muy fácil de comprender, y si realizamos un sencillo ejemplo, seguramente será mucho mejor.

Podemos crear una tabla en MySQL bajo la siguiente estructura dictada por el diagrama E-R

Se trata de una tabla de usuarios, por ejemplo una que se pueda utilizar para hacer un «loguin» de usuario. Los campos son:

  • id del usuario, AUTO_INCREMENT
  • A. Paterno
  • A. Materno
  • Nombre
  • Nombre de usuario o nick
  • Contraseña
  • Correo
  • Y los ultimos 4 campos son los llamados campos auditores, es decir:
    • USUA_CUSA -> Usuario que inserto el registro
    • USUA_FUSA -> Fecha en que se inserto el registro
    • USUA_CUSU -> Ultimo usuario que modifico el registro
    • USUA_FUSU -> Fecha de la última modificación del registro.

Podemos hacer un Trigger que se disparé al insertar un nuevo registro cuya función sea la de encriptar la contraseña y llenas los campos auditores.

Para crear el Trigger, podemos usar cualquier herramienta para administración de MySQL, en mi caso use el software de Aqua Data Studio 6.5, pero se puede usar el MySQL Query Browser que proporciona MySQL AB.

La función AES_ENCRYPT proporcionada por MySQL es la más segura que dispone MySQL. El primer argumento de esta función es la contraseña a encriptar y el segundo argumento es una clave con la cual se encriptara dicha contraseña. Como es de suponerse, para desencriptar una contraseña es necesario conocer la clave con la cual fue encriptada.

Con CURRENT_USER y CURRENT_DATE nos devuelven el usuario actual de la BASE DE DATOS con la que estamos conectados y la Fecha actual respectivamente.

Escrito el anterior trigger, solo nos resta, ejecutarlo para que se pueda crear.

Finalmente, solo debemos realizar una sentencia INSERT INTO como la siguiente:

INSERT INTO TACUSUA(USUA_VPAT, USUA_VMAT, USUA_VNOM, USUA_VUSU, USUA_VPAS, USUA_VCOR)
VALUES(‘ROMO’, ‘PEDRAZA’, ‘ASCARI Q.’, ‘windoctor’, ‘123’, ‘windoctor@mexico.com’)

Como se observa, dejamos fuera del INSERT INTO a los campos auditores pues estos serán insertados desde el trigger y a la llave primaria pues  AUTO_INCREMENT.

Por último, podemos ver el resultado de relizar un INSERT…. como se muestra en la figura de arriba, el trigger si se ejecuto y nos llenos los campos auditores, así como encriptar la contraseña.

Saludos!!