Disparadores o Triggers en una base de datos

29 01 2009

Recordando algunas utilidades de una base de datos hoy hablaré de una en particular: los Disparadores o Triggers.

Un Disparador o Trigger 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).

accion_disparador

Las ventajas de usar los Disparadores son:

  • La 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 o relinquear.
  • Logs automáticos de cambios a las tablas. Una aplicación puede guardar un registro corriente de cambios, creando un disparador que se active siempre que una tabla se modifique.
  • La notificación automática de cambios a la Base de Datos con alertas de evento en los disparadores.

Los Dispararores 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.

Un ejemplo de un disparador seria uno asociado a la sentencia DELETE en una tabla de clientes, para impedir que se elimine uno que tenga un saldo distinto de cero.  Otro disparador seria guardar los datos que se modifican de un cliente en otra base de datos que serviria de auditoria.

Acontinuación veremos un sencillo ejemplo práctico para una base de datos en MySQL 5

Crearemos la tabla de clientes:

CREATE TABLE clientes
(
id int not null auto_increment,
nombre varchar(100),
seccion varchar(10),
PRIMARY KEY(id),
KEY(nombre)
) ENGINE = InnoDB;

Guardamos algunos registros:

INSERT INTO clientes (nombre, seccion) VALUES

('Ivan','administración'),
('Susana','jefe de prensa'),
('Max','asistente operativo'),
('Javier','supervisor');

Creamos una tabla que será la que guardará los datos de la “auditoria”

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;

y finalmente un Disparador o Trigger que se active cada vez que alguien modifique un dato de la tabla clientes y lo guardará en una tabla junto al nombre del usuario y la fecha.

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() );
CREATE TRIGGER trigger_auditoria_usuarios AFTER UPDATE ON usuarios
FOR EACH ROW
INSERT INTO auditoria_usuarios(Nombre_usuario, Anterior_pass, Usuario, Modificado )
VALUES (OLD.Nombre_usuario, OLD.Pass, CURRENT_USER(), NOW() );

Espero que les haya servido de guía!!!


Acciones

Information

6 responses

5 09 2009
Einar

quisiera saber como seria los disparadores de actualizacion, si :
una tabla llamada “pedido” donde exite un campo calculado llamado “monto_total”, donde “monto_total” es el resultado de unos campo “cantidad” y “precio_unitario” de la tabla “detalle_producto”.

Al momento de dar una alta, baja o modificacion…. deseo que el campo calculado “monto_total”se actualize automaticamente y me muestre solo el monto actualizado.

Quisiera la codificaion de los diparadores.
Muchas gracias!!!!

5 09 2009
argordmel

Einar: Por lo que veo no lograste captar la idea de los disparadores.

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).

Espero que este comentario te sirva de ayuda.

Agur y saludos desde algún lugar de Colombia!!!

19 10 2010
| Fénix Team

[…] Disparadores o Triggers en una base de datos […]

15 11 2010
roger

DISCULPA USUARIOS ES UNA TABLA QUE RESIENESTAS CREANDO Y A LA CUAL VAS AGREGAR LA NUEVA INFORMACION

15 12 2010
mario

creo que lo que Einar quiere es que a la hora de modificar la cantidad del campo cantidad y el precio del campo precio unitario automaticamente en otra tabla llamada monto total se actualice update en este campo ese seria el disparador y que muetre el nuevo monto total de la otra tabla

22 02 2012
af

TEXTUAL ” Los INSERT permiten NEW, los DELETE sólo OLD y los UPDATE ambas.”
porque tu sentencia es
“INSERT INTO auditoria_usuarios(Nombre_usuario, Anterior_pass, Usuario, Modificado )
VALUES (OLD.Nombre_usuario, OLD.Pass, CURRENT_USER(), NOW() );”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: