Triggers
Triggers
Triggers
(No puede haber dos disparadores en una misma tabla que correspondan al mismo
momento y sentencia)
nombre_tabla
sentencia_disp: Comando a ejecutar
Ejemplo:
CREATE TRIGGER testref AFTER INSERT ON test1 //Nombre del trigger y tabla
que se afectara
FOR EACH ROW //Las filas que se afectaran después de la ejecución del
trigger
BEGIN
INSERT INTO test2 SET a2 = NEW.a1; //Datos que serán cambiados por los
nuevos datos
END
Notas:
Un trigger no puede hacer referencia a una tabla por su nombre, excepto a través de
OLD y NEW (sólo aplicable a comandos SELECT)
Un trigger no puede hacer llamadas a stored procedures (no se puede usar la
sentencia CALL)
No pueden utilizarse transacciones en un trigger
Creamos un archivo de texto que le llamaremos EJEMPLO1.SQL Que
será el cual almacenará nuestro código SQL que de ahora en adelante
pondré en negrita.
- Creamos la base de datos:
- Crearemos las tablas de apuntes y saldos del tipo InnoDB, con una clave
primaria para identificar cada registro de la tabla como único.
DROP TABLE IF EXISTS APUNTES;
CREATE TABLE APUNTES (
ASIENTO INT(8) DEFAULT 0,
LINEA SMALLINT(5) DEFAULT 0,
FECHA DATE DEFAULT ‘2006-01-01’,
TEXTO VARCHAR(40) default '',
CUENTA CHAR(10) default '',
DEBE DOUBLE(10,2) DEFAULT 0,
HABER DOUBLE(10,2) DEFAULT 0,
PRIMARY KEY (ASIENTO,LINEA),
KEY K2(CUENTA, FECHA) )
ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
- Creamos la tabla de Saldos, también con una clave primaria única.
DROP TABLE IF EXISTS SALDO;
CREATE TABLE SALDO (
CUENTA CHAR(10) NOT NULL default '',
ANO SMALLINT(4) DEFAULT 0,
MES TINYINT(2) DEFAULT 0,
DEBE DOUBLE(10,2) DEFAULT 0,
HABER DOUBLE(10,2) DEFAULT 0,
PRIMARY KEY (CUENTA,ANO,MES) )
ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
- Vamos a proceder a crear los Triggers, para la tabla de apuntes.
- Primero el trigger de inserción de registros.
Atención a los delimitadores y al punto y coma de final de sentencia.
Remarcar que los saldos se actualizan después de entrar un registro en la
tabla de apuntes (AFTER INSERT) .
Muy interesante es la orden: INSERT INTO ... ON DUPLICATE KEY
UPDATE.
Esta sentencia inserta un registro en la tabla de saldos, y si este existiera,
actualiza solamente las columnas debe y haber. Por eso hemos definido
claves primarias (PRIMARY KEY) en las tablas, requisito indispensable
para que esta sentencia funcione.
DELIMITER //
CREATE TRIGGER APTS_I AFTER INSERT ON APUNTES
FOR EACH ROW
BEGIN
INSERT INTO SALDO SET
SALDO.CUENTA=NEW.CUENTA,
SALDO.ANO=YEAR(NEW.FECHA),
SALDO.MES=MONTH(NEW.FECHA),
SALDO.DEBE=NEW.DEBE,
SALDO.HABER=NEW.HABER
ON DUPLICATE KEY UPDATE
SALDO.DEBE=SALDO.DEBE+NEW.DEBE,
SALDO.HABER=SALDO.HABER+NEW.HABER ;
END;//
DELIMITER ;
MySQL FoxPro
OLD.DEB OLDVAL(“DEBE”,”APUNTES”)
E
NEW.DEB CURVAL(“DEBE”,”APUNTES”)
E
DELIMITER //
CREATE TRIGGER APTS_U AFTER UPDATE ON APUNTES
FOR EACH ROW
BEGIN
INSERT INTO SALDO SET
SALDO.CUENTA=OLD.CUENTA,
SALDO.ANO=YEAR(OLD.FECHA),
SALDO.MES=MONTH(OLD.FECHA),
SALDO.DEBE=OLD.DEBE*(-1),
SALDO.HABER=OLD.HABER*(-1)
ON DUPLICATE KEY UPDATE
SALDO.DEBE=SALDO.DEBE+(OLD.DEBE*(-1)),
SALDO.HABER=SALDO.HABER+(OLD.HABER*(-1)) ;
INSERT INTO SALDO SET
SALDO.CUENTA=NEW.CUENTA,
SALDO.ANO=YEAR(NEW.FECHA),
SALDO.MES=MONTH(NEW.FECHA),
SALDO.DEBE=NEW.DEBE,
SALDO.HABER=NEW.HABER
ON DUPLICATE KEY UPDATE
SALDO.DEBE=SALDO.DEBE+NEW.DEBE,
SALDO.HABER=SALDO.HABER+NEW.HABER ;
END;//
DELIMITER ;
- Por último creamos el trigger de eliminación de apuntes
DELIMITER //
CREATE TRIGGER APTS_D AFTER DELETE ON APUNTES
FOR EACH ROW
BEGIN
INSERT INTO SALDO SET
SALDO.CUENTA=OLD.CUENTA,
SALDO.ANO=YEAR(OLD.FECHA),
SALDO.MES=MONTH(OLD.FECHA),
SALDO.DEBE=OLD.DEBE*(-1),
SALDO.HABER=OLD.HABER*(-1)
ON DUPLICATE KEY UPDATE
SALDO.DEBE=SALDO.DEBE+(OLD.DEBE*(-1)),
SALDO.HABER=SALDO.HABER+(OLD.HABER*(-1)) ;
END;//
DELIMITER ;
- Grabamos el archivo EJEMPLO1.SQL
- Vamos al prompt del MySQL con el usuario root. Para estar seguros de
tener todos los privilegios necesarios, y ejecutamos el código de ejemplo.
USE MYDB;
SET AUTOCOMMIT=0 ;
START TRANSACTION ;
INSERT INTO APUNTES VALUES (1,1,'2006-02-07','Fra.112 PEPE PALO','4300000001',1160,0);
INSERT INTO APUNTES VALUES (1,2,'2006-02-07','Fra.112 PEPE PALO','4770000001',0,160);
INSERT INTO APUNTES VALUES (1,3,'2006-02-07','Fra.112 PEPE PALO','7000000000',0,1000);
INSERT INTO APUNTES VALUES (2,1,'2006-03-20','Cobro Fra.112 PEPE
PALO','5700000000',1160,0);
INSERT INTO APUNTES VALUES (2,2,'2006-03-20','Cobro Fra.112 PEPE
PALO','4300000001',0,1160);
COMMIT;
Grabamos el archivo EJEMPLO2.SQL . Vamos al prompt de MySQL y ejecutamos el código.