/*Creación de la Base de Datos*/

CREATE DATABASE IF NOT EXISTS pruebas_trigger CHARACTER SET utf8 COLLATE utf8_general_ci;
USE pruebas_trigger;

-- Crear la tabla para realizar pruebas
CREATE TABLE prueba (
id_dato INT AUTO_INCREMENT PRIMARY KEY,
valor INT
)Engine = InnoDB;

-- Crear la tabla para registrar actividades
CREATE TABLE log_actividades (
id_actividad INT AUTO_INCREMENT PRIMARY KEY,
actividad VARCHAR(200),
fecha_modificacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tipo_modificacion VARCHAR(3)
)Engine=InnoDB;

/******MANEJO DE TRIGGERS**********/

SHOW TRIGGERS;
SHOW CREATE TRIGGER registrar_insercion_prueba;
DROP TRIGGER IF EXISTS par_impar;


/*****************CREANDO TRIGGERS****************************/

/*Trigger para indicar que se insertó un dato en la tabla prueba*/
DELIMITER $$
CREATE TRIGGER registrar_insercion_prueba AFTER INSERT ON prueba
	FOR EACH ROW BEGIN
		INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES
		('Se insertó un valor correcto','INS');
END $$

/*Trigger para indicar que se borró un dato en la tabla prueba*/
DELIMITER $$
CREATE TRIGGER registrar_borrado_prueba AFTER DELETE ON prueba
	FOR EACH ROW BEGIN
		INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES 
		('Se eliminó un valor','DEL');
	END $$


/*Trigger para indicar que se actualizó un dato en la tabla prueba*/
DELIMITER $$
CREATE TRIGGER registrar_actualizacion_prueba AFTER UPDATE ON prueba
	FOR EACH ROW BEGIN
		INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES 
		('Se actualizó un valor','UPT');
END $$

/***************TOMANDO VALORES NUEVOS Y VIEJOS*****************/


/*Indicando el valor insertado*/
DELIMITER $$

	CREATE TRIGGER valor_insertado AFTER INSERT ON prueba
		FOR EACH ROW BEGIN
			INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES 
			 ( CONCAT('Se Insertó el valor ',NEW.valor),'INS');
END $$


/*Tomando un valor anterior para indicar cuál se eliminó*/
DELIMITER $$

	CREATE TRIGGER valor_eliminado AFTER DELETE ON prueba
		FOR EACH ROW BEGIN
			INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES 
			 ( CONCAT('Se eliminó el valor ',OLD.valor),'DEL');
END $$

/*Ejercicio*/
/*AL REALIZAR UNA ACTUALIZACIÓN, INSERTAR EL MENSAJE
'El valor X se cambió por el valor Y'. En donde X es
el valor anterior y Y es el valor nuevo*/
/*Indicando el valor insertado*/
DELIMITER $$

	CREATE TRIGGER valor_actualizado AFTER UPDATE ON prueba
		FOR EACH ROW BEGIN
			INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES 
			(
				CONCAT('El valor ',OLD.valor,' Se cambió por ',NEW.valor),'UPT'
			);
END $$




/*****TRIGGERS PARA VER UNA CIERTA CONDICIÓN*******/


/*No inserta un cierto rango de valores (5-8) y toma
como valor por defecto en ese caso un 6*/
DELIMITER $$

CREATE TRIGGER validar_cantidad BEFORE INSERT ON prueba
	FOR EACH ROW BEGIN
		IF (NEW.valor >= 5 AND NEW.valor <= 8)
		THEN
		SET NEW.valor = 6;
		END IF;
END $$


/*No inserta un cierto rango de valores (5-8) y toma
como valor por defecto en ese caso un 6. También registra en la bitácora*/
DELIMITER $$

CREATE TRIGGER validar_cantidad_completo BEFORE INSERT ON prueba
	FOR EACH ROW BEGIN
		IF (NEW.valor >= 5 AND NEW.valor <= 8)
		THEN
		SET NEW.valor = 6;
		INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES
			('Se quiso insertar un valor incorrecto, se insertó el valor 6','INS');
		ELSE
			INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES
			('Se insertó un valor correcto','INS');
		END IF;
END $$


/*Ejercicio (Borrar antes los triggers existentes)*/
/*Crear un disparador llamado par_impar que en caso de insertar un número par, 
registre en bitácora 'Se insertó un número PAR', en caso contrario, inserte
'Se insertó un número NON'. En ambos casos el valor de modificación será INS*/

DELIMITER $$
CREATE TRIGGER par_impar BEFORE INSERT ON prueba
	FOR EACH ROW BEGIN
		IF(NEW.valor % 2 = 0)
			THEN 
				INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES 
			('Se insertó un número PAR','INS');
		ELSE 
				INSERT INTO log_actividades (actividad,tipo_modificacion) VALUES
			('Se insertó un número NON','INS');
		END IF;
END $$

