Hola amigos, hoy, como dice el título, vamos a hablar un poco sobre triggers o gatillos o disparadores.
La pregunta obligada es:
¿Qué son los triggers?
Los triggers son algo parecido a los procedimientos y funciones almacenadas aunque hay una importante diferencia, los procedimientos y funciones almacenadas nosotros controlamos el instante en que necesitamos se ejecuten mientras que los triggers se ejecutan de forma automática y no esta en nuestras manos controlar su ejecución.
Debido a que este post es sobre triggers, por el momento vamos a olvidarnos de los procedimientos y funciones almacenados, ya los veremos en otro post, para enfocarnos exclusivamente en los triggers.
Empezaremos por decir que los triggers se incorporaron a partir de la versión 5.0.2 por lo que podemos intuir que aún están en una etapa incipiente. Un disparador o trigger es un objeto incrustado en una base de datos y esta asociado a una tabla, se activa o ejecuta cuando ocurre un evento en particular en dicha tabla.
La tabla a la que se asocia el disparador debe ser una tabla permanente no es admisible una tabla temporal tampoco una vista.
¿Cuál es la sintaxis de un trigger?
La sintaxis de un trigger es la siguiente:
CREATE TRIGGER nombre momento_en_que_se_dispara evento_disparador ON nombre_de_la_tabla FOR EACH ROW sentencia
Nombre = Es el nombre del disparador que nosotros asignamos, no puede haber dos disparadores en una misma tabla que correspondan al mismo momento en que se disparan y sentencia.
Momento_en_que_se_dispara = Es el momento en que el disparador se activa y entra en ejecución, puede ser BEFORE (antes) o AFTER (después).
Evento_disparador = Se refiere a la sentencia o comando que activa el disparador, los valores pueden ser INSERT, DELETE o UPDATE.
Nombre_de_la_tabla = Indica el nombre de la tabla a la que esta asociado el disparador, recuerden que debe ser una tabla permanente y no puede ser una vista.
Sentencia = Es la sentencia que se ejecuta cuando el disparador se activa. Podemos ejecutar varias sentencias usando el constructor de sentencias compuestas BEGIN ….. END.
La pregunta obligada es:
¿Qué son los triggers?
Los triggers son algo parecido a los procedimientos y funciones almacenadas aunque hay una importante diferencia, los procedimientos y funciones almacenadas nosotros controlamos el instante en que necesitamos se ejecuten mientras que los triggers se ejecutan de forma automática y no esta en nuestras manos controlar su ejecución.
Debido a que este post es sobre triggers, por el momento vamos a olvidarnos de los procedimientos y funciones almacenados, ya los veremos en otro post, para enfocarnos exclusivamente en los triggers.
Empezaremos por decir que los triggers se incorporaron a partir de la versión 5.0.2 por lo que podemos intuir que aún están en una etapa incipiente. Un disparador o trigger es un objeto incrustado en una base de datos y esta asociado a una tabla, se activa o ejecuta cuando ocurre un evento en particular en dicha tabla.
La tabla a la que se asocia el disparador debe ser una tabla permanente no es admisible una tabla temporal tampoco una vista.
¿Cuál es la sintaxis de un trigger?
La sintaxis de un trigger es la siguiente:
CREATE TRIGGER nombre momento_en_que_se_dispara evento_disparador ON nombre_de_la_tabla FOR EACH ROW sentencia
Nombre = Es el nombre del disparador que nosotros asignamos, no puede haber dos disparadores en una misma tabla que correspondan al mismo momento en que se disparan y sentencia.
Momento_en_que_se_dispara = Es el momento en que el disparador se activa y entra en ejecución, puede ser BEFORE (antes) o AFTER (después).
Evento_disparador = Se refiere a la sentencia o comando que activa el disparador, los valores pueden ser INSERT, DELETE o UPDATE.
Nombre_de_la_tabla = Indica el nombre de la tabla a la que esta asociado el disparador, recuerden que debe ser una tabla permanente y no puede ser una vista.
Sentencia = Es la sentencia que se ejecuta cuando el disparador se activa. Podemos ejecutar varias sentencias usando el constructor de sentencias compuestas BEGIN ….. END.
Después de conocer la sintaxis de los disparadores la pregunta que viene a nuestra mente es:
¿Para qué me sirven los trigger?
Son varias las posibilidades de uso para los triggers, por ejemplo para hacer validaciones, sin embargo en esta ocasión vamos a ver unos ejemplos que nos sirvan para dejar huella de los cambios que se hacen a una tabla. Podría ser para auditoría, interesante!, no?
Permítanme explicarles un poco más la idea, el objetivo es registrar en una nueva tabla llamada CHEHIS (chequera historial) los cambios que se hagan a la tabla CHEQUERA, chequera es la tabla donde tenemos registrados los número de cuenta bancarios y una breve descripción del nombre del banco, por lo tanto debemos crear la tabla para auditoría (CHEHIS) prácticamente con los mismos campos que la taba CHEQUERA, un poco más adelante veremos por qué.
Este es el código para crear la nueva tabla:
cCmdSql := "CREATE TABLE IF NOT EXISTS CheHis (" +;
"ROW_ID INTEGER NOT NULL AUTO_INCREMENT COMMENT 'Llave'," +;
"CHE_CTA DECIMAL(10,0) NOT NULL COMMENT 'Número de cuenta'," +;
"CHE_DES CHAR(20) NOT NULL COMMENT 'Nombre o descripción del banco'," +;
"CHE_FDC DATE NOT NULL COMMENT 'Fecha de actualización'," +;
"CHE_HRA TIME NOT NULL COMMENT 'Hora de actualización'," +;
"PRIMARY KEY(ROW_ID))" +;
"ENGINE = InnoDB COMMENT 'Historico de chequeras';"
La estructura de la tabla CHEQUERA es la misma, de hecho la estructura de la tabla CHEHIS es una copia de la tabla chequera.
Ahora viene la parte más interesante, vamos a ver este trozo de código:
cCmdSql := "CREATE TRIGGER insche AFTER INSERT ON chequera " +;
"FOR EACH ROW " +;
"BEGIN " +;
"INSERT INTO chehis SET che_cta = NEW.che_cta," +;
"che_des = NEW.che_des," +;
"che_fdc = CURDATE()," +;
"che_hra = CURTIME();" +;
"END"
Como que es un código bastante raro, no?, pero no se preocupen pues ya conocimos la sintaxis y ahora vamos a diseccionarlo:
Insche = Es el nombre del disparador (INSERT CHEQUERA)
AFTER = Es el momento en que se dispara
INSERT = Es el evento disparador, en otras palabras, el disparador se va a ejecutar después del comando INSERT.
Chequera = Es el nombre de la tabla a la que esta asociado el disparador
Observen que estamos haciendo uso del constructor de sentencias compuestas BEGIN ….. END y la sentencia o comando que se va a ejecutar será un INSERT.
Aclaremos puntos:
Por cada comando INSERT realizado en la tabla chequera también se va a ejecutar un comando INSERT en la tabla CHEHIS, observen que los nombre de los campos tienen antepuestos la palabra NEW esto se refiere a que vamos a registrar en la tabla de auditoría los nuevos valores que se registraron en la tabla CHEQUERA. Tal vez ahora no tenga mucho sentido, esperen a ver el código siguiente.
cCmdSql := "CREATE TRIGGER updche AFTER UPDATE ON chequera " +;
"FOR EACH ROW " +;
"BEGIN " +;
"INSERT INTO chehis SET che_cta = OLD.che_cta," +;
"che_des = OLD.che_des," +;
"che_fdc = OLD.che_fdc," +;
"che_hra = OLD.che_hra;" +;
"INSERT INTO chehis SET che_cta = NEW.che_cta," +;
"che_des = NEW.che_des," +;
"che_fdc = CURDATE()," +;
"che_hra = CURTIME();" +;
"END"
Al igual que el código anterior, también este código lo vamos a desmenuzar.
Updche = Es el nombre del disparador (UPDATE CHEQUERA)
AFTER = Es el momento en que se dispara
UPDATE = Es el evento disparador, en otras palabras, el disparador se va a ejecutar después del comando UPDATE.
Chequera = Es el nombre de la tabla a la que esta asociado el disparador
Ahora bien, observen que estamos insertando dos registros en la tabla para auditoría por cada UPDATE de la tabla CHEQUERA, el primero se graba con los datos que había antes de realizar el UPDATE, por eso llevan antepuesto la palabra OLD, y el otro registro se grabará con los valores que quedan después de la sentencia UPDATE a la tabla chequera.
Esto nos permitirá conservar en una tabla como estaba el registro antes del comando UPDATE a la tabla CHEQUERA y como queda después del comando UPDATE.
Amigos, espero que me haya quedado claro el concepto de los trigger o disparadores, lo suficientemente claro como para que lo apliquen en sus desarrollos y si no fuera así no duden en escribirme para aclarar sus dudas.
Tal vez ahora ustedes puedan crear un trigger para cuando se elimine un registro con el comando DELETE, cierto?.
No dejen de comentarme sus logros y avances.
Hasta la próxima.
4 comentarios:
Esto pinta muy bien, se pueden afectar saldos, como dices en el ejemplo, llevar una bitacora, etc.
pero me pregunto esta opcion es exclusiva de mysql? si en un futuro quisieramos emigra a sql u oracle que pasaria?
Saludos desde Cuernavaca
Marco Augusto Rodriguez
Marco:
Desafortunadamente no he tenido tiempo para escudriñar en otros motores solo con MySql.
Ojalá algun colega que tenga experiencia en algún otro motor quiera sacarnos de nuestra ignorancia.
Saludos
Los triggers son tan antiguos como lo son las bases de datos relacionales.
Tanto SQL Server, Oracle, Sybase, DB2 y otros manejan triggers perfectametne, incluso Advantage Database Server maneja triggers sobre tablas DBFCDX y sobre ADTADI
Master:
Una vez más, sacando las papas del fuego.
Muchas gracias por el aporte.
Un abrazo
Publicar un comentario en la entrada