Está en la página 1de 34

Solucion_Laboratorio_SQL

DIEGO ANDRES BARRETO URIBE


MANUEL MARTINEZ JUNCO
JONATHAN ADOLFO RIVAS
HECTOR EDUARDO BELLO

ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN ADSI 1310048

SENA
Colombia, 23/072017
Contenido
TABLA PROFESOR.........................................................................................................................................4
TABLA CURSO...............................................................................................................................................6
TABLA ESTUDIANTES....................................................................................................................................8
TABLA ESTUDIANTEXCURSO.........................................................................................................................9
TABLA ARTICULO........................................................................................................................................11
TABLA CLIENTE...........................................................................................................................................12
TABLA PEDIDO...........................................................................................................................................13
TABLA COMPANIA......................................................................................................................................15
TABLA TIPOS AUTOMOTORES....................................................................................................................16
TABLA AUTOMOTORES..............................................................................................................................17
TABLA ASEGURAMIENTOS.........................................................................................................................18
TABLA INCIDENTES.....................................................................................................................................19
3 Procedimientos almacenados para procesos con MySQL.................................................20
3.1 Proceso mostrar cursos.........................................................................................................20
3.2 Mostrar pedidos.......................................................................................................................20
3.3 Empresas fundadas entre 1991 y 1998...........................................................................21
3.4 Clientes ordenados por apellidos:.....................................................................................21
3.5 Incidentes con un herido......................................................................................................22
3.6 Incidentes del vehículo FLL420..........................................................................................22
4. Funciones..........................................................................................................................................22
4.1 Contar estudiantes mayores de 22...................................................................................22
4.2 Mostrar el nombre del más estudiante más joven......................................................23
4.3 Valor promedio de los cursos con más de 40 horas....................................................23
4.4 Sueldo promedio de profesores categoría 1..................................................................24
4.5 Nombre del profesor con el menor sueldo.....................................................................24
6.1 Disparador para profesor en MySQL.....................................................................................25
6.1.1 Actualizar............................................................................................................................25
6.1.2 Eliminando registros.......................................................................................................26
6.2 Disparador para la tabla curso en MySQL..........................................................................26
6.2.1 Actualizar Curso...................................................................................................................26
6.2.2 Eliminar registros curso.................................................................................................27
6.3 Disparadores para estudiante.............................................................................................28
6.3.1 Disparador para actualizaciones de registros........................................................28
6.3.2 Disparador para eliminación de registros...............................................................28
6.4 Disparadores para automotores.............................................................................................29
6.4.1 Disparador de actualización.........................................................................................29
6.4.2 Disparador eliminación registros................................................................................29
6.5 Disparadores para aseguramientos en MySQL.............................................................30
6.5.1 Trigger para actualización.............................................................................................30
6.5.2 Trigger para eliminación................................................................................................31
6.6 Disparadores para la tabla incidentes.............................................................................31
6.6.1 Actualización.....................................................................................................................32
6.6.2 Eliminación de registros................................................................................................32
6.7 Disparador de actualización con Oracle (Tabla artículo)...........................................32
6.7.1 Actualización.....................................................................................................................32
6.8 Disparadores para la tabla cliente....................................................................................33
6.8.1 Actualizar............................................................................................................................33
6.8.2 Eliminar registros.............................................................................................................34
6.9 Disparadores para la tabla pedido....................................................................................34
6.9.1 Actualizar............................................................................................................................34
6.9.2 Eliminar registros.............................................................................................................35
TABLA PROFESOR

mysql> describe profesor;

+-----------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------+-------------+------+-----+---------+-------+

| doc_prof | varchar(20) | NO | PRI | | |

| nom_prof | varchar(30) | NO | | NULL | |

| ape_prof | varchar(30) | NO | | NULL | |

| cate_prof | int(20) | NO | | NULL | |

| sal_prof | int(30) | NO | | NULL | |

+-----------+-------------+------+-----+---------+-------+

5 rows in set (0.00 sec)

mysql> select *from profesor;

+---------------+-----------+----------+-----------+----------+

| doc_prof | nom_prof | ape_prof | cate_prof | sal_prof |

+---------------+-----------+----------+-----------+----------+

| 1.098.765.789 | Alejandra | Torres | 4 | 1100000 |

| 13.826.789 | Maritza | Angarita | 1 | 550000 |

| 63.502.720 | Martha | Rojas | 2 | 690000 |

| 91.216.904 | Carlos | Pérez | 3 | 950000 |

+---------------+-----------+----------+-----------+----------+

4 rows in set (0.03 sec)


mysql> select *from profesor;

+---------------+-----------+----------+-----------+----------+

| doc_prof | nom_prof | ape_prof | cate_prof | sal_prof |

+---------------+-----------+----------+-----------+----------+

| 1.098.765.789 | Alejandra | Torres | 4 | 1100000 |

| 1012337825 | Diego | Barreto | 3 | 1200000 |

| 13.826.789 | Maritza | Angarita | 1 | 550000 |

| 63.502.720 | Martha | Rojas | 2 | 690000 |

| 91.216.904 | Carlos | Pérez | 3 | 950000 |

+---------------+-----------+----------+-----------+----------+

5 rows in set (0.00 sec)

TABLA CURSO
mysql> describe curso;

+------------+--------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+------------+--------------+------+-----+---------+----------------+

| cod_curs | int(11) | NO | PRI | NULL | auto_increment |

| nom_curs | varchar(100) | NO | | NULL | |

| horas_cur | int(11) | NO | | NULL | |

| valor__cur | int(11) | NO | | NULL | |

+------------+--------------+------+-----+---------+----------------+

4 rows in set (0.01 sec)

mysql> select* from curso;

+----------+-------------------------------+-----------+------------+

| cod_curs | nom_curs | horas_cur | valor__cur |

+----------+-------------------------------+-----------+------------+

| 149842 | Fundamentos de bases de datos | 40 | 500000 |

| 250067 | Fundamentos de SQL | 20 | 700000 |

| 289011 | Manejo de MYSQL | 45 | 550000 |

| 345671 | Fundamentals of Oracle | 60 | 3000000 |

+----------+-------------------------------+-----------+------------+

4 rows in set (0.00 sec)


mysql> select *from curso;

+----------+-------------------------------+-----------+------------+

| cod_curs | nom_curs | horas_cur | valor__cur |

+----------+-------------------------------+-----------+------------+

| 149842 | Fundamentos de bases de datos | 40 | 500000 |

| 172943 | Procedimientos almacenados | 20 | 500000 |

| 250067 | Fundamentos de SQL | 20 | 700000 |

| 289011 | Manejo de MYSQL | 45 | 550000 |

| 345671 | Fundamentals of Oracle | 60 | 3000000 |

+----------+-------------------------------+-----------+------------+
TABLA ESTUDIANTES
TABLA ESTUDIANTEXCURSO.
mysql> select cod_curso, doc_est, nom_est, fec_ini_estcur
-> from curso join estudiante join estudiantexcurso
-> on doc_est = doc_est_estcur and cod_curso = cod_curso_estcur;
+------------+-----------------+-----------+-----------------+
| cod_curso | doc_est | nom_est | fec_ini_estcur |
+------------+-----------------+-----------+-----------------+
| 289011 | 1.098.765.678 | Carlos | 2011-01-02 |
| 250067 | 63.502.720 | María | 2011-01-03 |
| 289011 | 1.098.098.097 | Jonatan | 2011-01-02 |
| 345671 | 63.502.720 | María | 2011-01-04 |
| 172943 | 72240535 | Jhon | 2014-02-06 |
+------------+------------------+----------+------------------+
TABLA ARTICULO
TABLA CLIENTE
TABLA PEDIDO
TABLA COMPANIA
TABLA TIPOS AUTOMOTORES
TABLA AUTOMOTORES
TABLA ASEGURAMIENTOS

call ins_asegura(5,'2007-08-15','2018-08-15', 4500000,'vigente',80000,'KXX95D');


TABLA INCIDENTES
3 Procedimientos almacenados para procesos con MySQL

En MySQL los procedimientos con select no son distintos de los insert y requieren
mucho menos trabajo que con Oracle.

3.1 Proceso mostrar cursos


Vamos a mostrar todos los cursos ordenados por valor.
USE `laboratoriosql`;
DROP procedure IF EXISTS `mostrar_cursos`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE mostrar_cursos ()
BEGIN
select *from curso order by valor_cur;
END$$
DELIMITER ;
Llamamos el procedimiento y obtenemos los datos que queremos.
Mysql> call mostrar_cursos;
+-----------+-------------------------------------+-----------+-----------+
| cod_curso | nom_curs | horas_cur | valor_cur |
+-----------+--------------------------------------+-----------+-----------+
| 149842 | Fundamentos de bases de datos | 40 | 500000 |
| 172943 | Procedimientos almacenados | 20 | 500000 |
| 289011 | Manejo de MySQL | 45 | 550000 |
| 250067 | Fundamentos de SQL | 20 | 700000 |
| 345671 | Fundamentos de Oracle | 60 | 3000000 |

3.2 Mostrar pedidos


USE `laboratoriosql`;
DROP procedure IF EXISTS `mostrar_pedidos`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE mostrar_pedidos ()
BEGIN
select id_pedido, id_art, tit_art, can_art_artped, val_ven_art_artped
from pedido join articulo join articuloxpedido
on id_pedido = id_ped_artped and id_art_artped = id_art;
END$$
DELIMITER ;
Llamamos el proceso y obtenemos los valores:
mysql> call mostrar_pedidos;
+-----------+--------+----------------------------------------+----------------
+--------------------+
| id_pedido | id_art | tit_art | can_art_artped | val_ven_art_artped |
+-----------+--------+----------------------------------------+----------------
+--------------------+
| 1 | 3 | Creación de un portal con php y mysql | 5 | 40000 |
| 1 | 4 | Administración de sistemas operativos | 12 | 55000 |
| 2 | 1 | Redes cisco | 5 | 65000 |
| 3 | 2 | Facebook y twitter para adultos | 10 | 55000 |
| 3 | 3 | Creación de un portal con php y mysql | 12 | 45000 |
| 4 | 1 | Redes cisco | 20 | 65000 |
+-----------+--------+----------------------------------------+----------------
+--------------------+
3.3 Empresas fundadas entre 1991 y 1998
USE `laboratoriosql`;
DROP procedure IF EXISTS `mostrar_empresas`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE mostrar_empresas()
BEGIN
select *from compañia
where comañofun >= 1991 and comañofun <= 1998;
END$$
DELIMITER ;
Llamamos el procedimiento:
mysql> call mostrar_empresas;
+----------------+----------------------+---------------+------------------------+
| comnit | comnombre | comañofun | comreplegal |
+----------------+-----------------------+---------------+------------------------+
| 800890890-2 | Seguros Atlantida | 1998 | Carlos López |
| 899999999-1 | Aseguradora Rojas | 1991 | Luis Fernando Rojas |
+----------------+------------------------+--------------+--------------------------+
3.4 Clientes ordenados por apellidos:
USE `laboratoriosql`;
DROP procedure IF EXISTS `clientesxapellido`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE clientesxapellido ()
BEGIN
select *from cliente
order by ape_cli desc;
END$$
DELIMITER ;
Llamamos el procedure:
3.5 Incidentes con un herido
USE `laboratoriosql`;
DROP procedure IF EXISTS `incidentes1herido`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE incidentes1herido ()
BEGIN
select incifecha, inciplaca, asefechainicio, aseestado, asevalorasegurado
from incidentes join aseguramientos
on inciplaca = aseplaca and incicantheridos = 1;
END$$
DELIMITER ;
Llamamos el proceso:
3.6 Incidentes del vehículo FLL420
USE `laboratoriosql`;
DROP procedure IF EXISTS `incifll420`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE PROCEDURE incifll420 ()
BEGIN
select incifecha, inciplaca, asefechainicio, asefechaexpiracion, aseestado,
asevalorasegurado
from incidentes join aseguramientos
on inciplaca = aseplaca and inciplaca = 'FLL420';
END$$
DELIMITER ;
Llamamos el procedimiento:

4. Funciones
4.1 Contar estudiantes mayores de 22
USE `laboratoriosql`;
DROP function IF EXISTS `contar22`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION contar22 ()
RETURNS INTEGER
BEGIN
DECLARE cantidad int;
select count(*) into cantidad from estudiante
where edad_est > 22;
RETURN cantidad;
END$$
DELIMITER ;
Llamamos la función y visualizamos el resultado:
mysql> select contar22();
+------------+
| contar22() |
+------------+
|3|
+------------+
4.2 Mostrar el nombre del más estudiante más joven
Primero he creado una función que devuelve como valor la edad del alumno más
joven:
USE `laboratoriosql`;
DROP function IF EXISTS `masJoven`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION masJoven ()
RETURNS int
BEGIN
DECLARE masJoven int;
SELECT edad_est into masJoven
from estudiante
order by edad_est asc limit 1;
RETURN masJoven;
END;$$
DELIMITER ;
Y luego la he combinado con un select, así:
mysql> select nom_est, edad_est from estudiante where edad_est = masJoven();
+---------+------------+
| nom_est | edad_est |
+---------+------------+
| Jonatan | 17 |
+---------+------------+
4.3 Valor promedio de los cursos con más de 40 horas
USE `laboratoriosql`;
DROP function IF EXISTS `promediocursos`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION promediocursos ()
RETURNS INTEGER
BEGIN
declare var_promedio int;
select avg(valor_cur) into var_promedio
from curso
where horas_cur > 40;
RETURN var_promedio;
END$$
DELIMITER ;
Probamos la función:
4.4 Sueldo promedio de profesores categoría 1
USE `laboratoriosql`;
DROP function IF EXISTS `promediosueldo`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION promediosueldo ()
RETURNS INTEGER
BEGIN
DECLARE avgsueldo int;
SELECT AVG(sal_prof) INTO avgsueldo FROM profesor
WHERE cate_prof = 1;
RETURN avgsueldo;
END$$
DELIMITER ;
Probamos la función con select:
mysql> select promediosueldo();
+---------------------+
| promediosueldo() |
+---------------------+
| 550000 |
+---------------------+
1 row in set (0.00 sec)
4.5 Nombre del profesor con el menor sueldo
USE `laboratoriosql`;
DROP function IF EXISTS `menorSueldo`;
DELIMITER $$
USE `laboratoriosql`$$
CREATE FUNCTION menorSueldo ()
RETURNS VARCHAR(30)
BEGIN
DECLARE nombre VARCHAR(30);
SELECT nom_profesor INTO nombre
FROM profesor
ORDER BY sal_prof ASC LIMIT 1;
RETURN nombre;
END$$
DELIMITER ;
mysql> select menorsueldo();
+-----------------+
| menorsueldo() |
+-----------------+
| Maritza |
+-----------------+
1 row in set (0.00 sec)

6.1 Disparador para profesor en MySQL


6.1.1 Actualizar
Creamos una tabla para auditoria llamada “auditoria_profesor” la cual incluirá los
viejos y nuevos valores de las columnas afectadas, y el usuario del sistema que
realizó los cambios. Para esto último se utiliza la función current_user() que ya viene
definida en MySQL, la cual se colocará como valor por defecto para la columna
audi_usuario:
Una forma de crear el disparador es ir a la tabla profesor en mysql Workbench y
editar la opción triggers:
La aplicación genera el código adecuado:
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.profesor_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`profesor_BEFORE_UPDATE` BEFORE UPDATE ON `profesor`
FOR EACH ROW
BEGIN
insert into auditoria_profesor(audi_nombreAnterior, audi_apellidoAnterior,
audi_categoriaAnterior, audi_salarioAnterior, audi_nombreNuevo,
audi_apellidoNuevo, audi_categoriaNuevo, audi_salarioNuevo,
audi_fechaModificacion, audi_usuario, audi_docProfesor, audi_accion)
values (old.nom_profesor, old.ape_profesor, old.cate_prof, old.sal_prof,
new.nom_profesor, new.ape_profesor, new.cate_prof, new.sal_prof, now(),
current_user(), new.doc_profesor, 'Actualización');
END$$
DELIMITER ;
Voy a editar la categoría y salario del profesor Rafael Conde quien tiene categoría 3 y
pasará a 4 con el mismo sueldo que el otro profesor que ostenta esa categoría.
update profesor set cate_prof = 4 where doc_profesor = '73542983';
update profesor set sal_prof = 1100000 where doc_profesor = '73542983';
Y ahora miramos cómo quedó la tabla profesor y la tabla auditoria_profesor (La
resolución no es la mejor pero tuve que editar la captura para poder mostrar todos lo
contenidos):
Para que current_user() no me de siempre root, he creado un usuario nuevo:
CREATE USER 'jhonBarc'@'localhost' IDENTIFIED BY 'jhon12345';
le he dado privilegios de acceso:
GRANT ALL PRIVILEGES ON * . * TO 'jhonBarc'@'localhost';
Y luego refrescamos los privilegios:
Ahora voy a usar ese nuevo usuario para los ejercicios. Cerrando mi conexión y
regresando con mi nuevo usuario y contraseña.
Ahora la función current_user() devuelve el valor jhonbarc@localhost.
6.1.2 Eliminando registros
Vamos a borrar un registro en la tabla profesor con el nuevo usuario. Pero primero
vamos a crear un trigger para ese evento:
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.profesor_AFTER_DELETE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`profesor_AFTER_DELETE` AFTER DELETE ON `profesor` FOR
EACH ROW
BEGIN
INSERT INTO auditoria_profesor(audi_nombreAnterior, audi_apellidoAnterior,
audi_categoriaAnterior, audi_salarioAnterior, audi_fechaModificacion, audi_usuario,
audi_docProfesor, audi_accion)
VALUES(old.nom_profesor, old.ape_profesor, old.cate_prof, old.sal_prof, now(),
current_user(), old.doc_profesor, 'Registro eliminado');
END$$
DELIMITER ;
Eliminamos el registro:
delete from profesor where doc_profesor = 'Rafael';
Y ahora miramos que ha ocurrido con nuestras tablas profesor y auditoría profesor:
Se ha borrado el registro del profesor Rafael Conde y ahora sí aparece que el evento
lo realizó el usuario jhonBarc tal como se ve en la siguiente imagen:

6.2 Disparador para la tabla curso en MySQL


6.2.1 Actualizar Curso
CREATE TABLE `laboratoriosql`.`auditoria_curso` (
`idaudi` INT NOT NULL AUTO_INCREMENT,
`audi_nombreAnterior` VARCHAR(100) NULL,
`audi_horasAnterior` INT NULL,
`audi_valorAnterior` INT NULL,
`audi_nombreNuevo` VARCHAR(100) NULL,
`audi_horasNuevo` INT NULL,
`audi_valorNuevo` INT NULL,
`audi_fechaModificacion` DATE NULL,
`audi_usuario` VARCHAR(45) NULL DEFAULT 'current_user()',
`audi_codCurso` INT NULL,
`audi_accion` VARCHAR(45) NULL,
PRIMARY KEY (`idaudi`));
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.curso_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`curso_BEFORE_UPDATE` BEFORE UPDATE ON `curso` FOR
EACH ROW
BEGIN
insert into auditoria_curso(audi_nombreAnterior, audi_horasAnterior,
audi_valorAnterior, audi_nombreNuevo, audi_horasNuevo, audi_valorNuevo,
audi_fechaModificacion, audi_usuario, audi_codCurso, audi_accion)
values( old.nom_curs, old.horas_cur, old.valor_cur, new.nom_curs, new.horas_cur,
new.valor_cur, now(), current_user(), new.cod_curso, 'Actualización');
END$$
DELIMITER ;
Probamos el disparador:
update curso set nom_curs= 'Procedimientos almacenados MySQL' where cod_curso
= 172943;
6.2.2 Eliminar registros curso
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.curso_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`curso_BEFORE_UPDATE` BEFORE UPDATE ON `curso` FOR
EACH ROW
BEGIN
insert into auditoria_curso(audi_nombreAnterior, audi_horasAnterior,
audi_valorAnterior, audi_nombreNuevo, audi_horasNuevo, audi_valorNuevo,
audi_fechaModificacion, audi_usuario, audi_codCurso, audi_accion)
values( old.nom_curs, old.horas_cur, old.valor_cur, new.nom_curs, new.horas_cur,
new.valor_cur, now(), current_user(), new.cod_curso, 'Actualización');
END$$
DELIMITER ;
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.curso_AFTER_DELETE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`curso_AFTER_DELETE` AFTER DELETE ON `curso` FOR
EACH ROW
BEGIN
insert into auditoria_curso(audi_nombreAnterior, audi_horasAnterior,
audi_valorAnterior, audi_fechaModificacion, audi_usuario, audi_codCurso,
audi_accion)
values(old.nom_curs, old.horas_cur, old.valor_cur, now(), current_user(),
old.cod_curso, 'Registro eliminado');
END$$
DELIMITER ;
6.3 Disparadores para estudiante
Creamos la tabla para la auditoría:
CREATE TABLE `laboratoriosql`.`auditoria_estudiantes` (
`idaudi` INT NOT NULL AUTO_INCREMENT,
`audi_nomAnterior` VARCHAR(30) NULL,
`audi_apeAnterior` VARCHAR(30) NULL,
`audi_edadAnterior` INT NULL,
`audi_nomNuevo` VARCHAR(30) NULL,
`audi_apeNuevo` VARCHAR(30) NULL,
`audi_edadNuevo` INT NULL,
`audi_fechaModificacion` DATETIME NULL DEFAULT
CURRENT_TIMESTAMP,
`audi_usuario` VARCHAR(45) NULL DEFAULT 'CURRENT_USER()',
`audi_docest` VARCHAR(20) NULL,
`audi_accion` VARCHAR(45) NULL,
PRIMARY KEY (`idaudi`));
6.3.1 Disparador para actualizaciones de registros
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.estudiante_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`estudiante_BEFORE_UPDATE` BEFORE UPDATE ON
`estudiante` FOR EACH ROW
BEGIN
insert into auditoria_estudiantes(audi_nomAnterior, audi_apeAnterior,
audi_edadAnterior, audi_nomNuevo, audi_apeNuevo, audi_edadNuevo,
audi_fechaModificacion, audi_usuario, audi_docest, audi_accion)
values(old.nom_est, old.ape_est, old.edad_est, new.nom_est, new.ape_est,
new.edad_est, now(), current_user(), old.doc_est, 'Actualización');
END$$
DELIMITER ;
6.3.2 Disparador para eliminación de registros
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.estudiante_AFTER_DELETE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`estudiante_AFTER_DELETE` AFTER DELETE ON `estudiante`
FOR EACH ROW
BEGIN
insert into auditoria_estudiante(audi_nomAnterior, audi_apeAnterior,
audi_edadAnterior, audi_fechaModificacion, audi_usuario, audi_docest,
audi_accion)
values(old.nom_est, old.ape_est, old.edad_est, now(), current_user(), old.doc_est,
'Registro eliminado');
END$$
DELIMITER ;

6.4 Disparadores para automotores


6.4.1 Disparador de actualización
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.automotores_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`automotores_BEFORE_UPDATE` BEFORE UPDATE ON
`automotores` FOR EACH ROW
BEGIN
insert into auditoria_automotores(audi_marcaAnterior, audi_tipoAnterior,
audi_modeloAnterior, audi_numAnterior, audi_cilinAnterior, audi_chasisAnterior,
audi_marcaNuevo, audi_tipoNuevo, audi_modeloNuevo, audi_numNuevo,
audi_cilinNuevo, audi_chasisNuevo, audi_fechaModificacion, audi_usuario,
audi_placa, audi_accion)
values(old.automarca, old.autotipo, old.automodelo, old.autonumpasajeros,
old.autocilindraje, old.autonumchasis, new.automarca, new.autotipo,
new.automodelo, new.autonumpasajeros, new.autocilindraje, new.autonumchasis,
now(), current_user(), old.autoplaca, 'Actualización');
END$$
DELIMITER ;
6.4.2 Disparador eliminación registros
DELIMITER ;
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.automotores_AFTER_DELETE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`automotores_AFTER_DELETE` AFTER DELETE ON
`automotores` FOR EACH ROW
BEGIN
insert into auditoria_automotores(audi_marcaAnterior, audi_tipoAnterior,
audi_modeloAnterior, audi_numAnterior, audi_cilinAnterior, audi_chasisAnterior,
audi_fechaModificacion, audi_usuario, audi_placa, audi_accion)
values(old.automarca, old.autotipo, old.automodelo, old.autonumpasajeros,
old.autocilindraje, old.autonumchasis, now(), current_user(), old.autoplaca, 'Registro
eliminado');
END$$
DELIMITER ;
6.5 Disparadores para aseguramientos en MySQL
CREATE TABLE `laboratoriosql`.`auditoria_aseguramientos` (
`audi_aseIniAnterior` DATE NOT NULL,
`audi_aseFinAnterior` DATE NULL,
`audi_valorAseAnterior` INT NULL,
`audi_estadoAnterior` VARCHAR(11) NULL,
`audi_placaAnterior` VARCHAR(6) NULL,
`audi_costoAnterior` INT NULL,
`audi_aseIniNuevo` DATE NOT NULL,
`audi_aseFinNuevo` DATE NULL,
`audi_valorNuevo` INT NULL,
`audi_estadoNuevo` VARCHAR(11) NULL,
`audi_placaNuevo` VARCHAR(6) NULL,
`audi_costoNuevo` INT NULL,
`audi_fechaModificacion` DATETIME NULL,
`audi_usuario` VARCHAR(45) NULL DEFAULT 'current_user()',
`audi_asecodigo` INT NULL,
`audi_accion` VARCHAR(45) NULL,
PRIMARY KEY (`audi_aseIniAnterior`));
6.5.1 Trigger para actualización
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.aseguramientos_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`aseguramientos_BEFORE_UPDATE` BEFORE UPDATE ON
`aseguramientos` FOR EACH ROW
BEGIN
insert into auditoria_aseguramientos(audi_aseIniAnterior, audi_aseFinAnterior,
audi_valorAseAnterior, audi_estadoAnterior, audi_placaAnterior,
audi_costoAnterior, audi_aseIniNuevo, audi_aseFinNuevo, audi_valorNuevo,
audi_estadoNuevo, audi_placaNuevo, audi_costoNuevo, audi_fechaModificacion,
audi_usuario, audi_asecodigo, audi_accion)
values(old.asefechainicio, old.asefechaexpiracion, old.asevalorasegurado,
old.aseestado, old.aseplaca, old.asecosto, new.asefechainicio,
new.asefechaexpiracion, new.asevalorasegurado, new.aseestado, new.aseplaca,
new.asecosto, now(), current_user(), old.asecodigo, 'Actualización');
END$$
DELIMITER ;
6.5.2 Trigger para eliminación
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.aseguramientos_AFTER_DELETE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`aseguramientos_AFTER_DELETE` AFTER DELETE ON
`aseguramientos` FOR EACH ROW
BEGIN
insert into auditoria_aseguramientos(audi_aseIniAnterior, audi_aseFinAnterior,
audi_valorAseAnterior, audi_estadoAnterior, audi_placaAnterior,
audi_costoAnterior, audi_fechaModificacion, audi_usuario, audi_asecodigo,
audi_accion)
values(old.asefechainicio, old.asefechaexpiracion, old.asevalorasegurado,
old.aseestado, old.aseplaca, old.asecosto, now(), current_user(), old.asecodigo,
'Eliminación registro');
END$$
DELIMITER ;
6.6 Disparadores para la tabla incidentes
CREATE TABLE `laboratoriosql`.`auditoria_incidentes` (
`idaudi` INT NOT NULL AUTO_INCREMENT,
`audi_fechaAnterior` DATE NOT NULL,
`audi_placaAnterior` VARCHAR(6) NOT NULL,
`audi_lugarAnterior` VARCHAR(40) NOT NULL,
`audi_heridosAnterior` INT(11) NULL,
`audi_fatalidadesAnterior` INT(11) NULL DEFAULT NULL,
`audi_involucradosAnterior` INT(11) NULL DEFAULT NULL,
`audi_fechaNuevo` DATE NOT NULL,
`audi_placaNuevo` VARCHAR(6) NOT NULL,
`audi_lugarNuevo` VARCHAR(40) NOT NULL,
`audi_heridosNuevo` INT(11) NULL,
`audi_fatalidadesNuevo` INT(11) NULL DEFAULT NULL,
`audi_involucradosNuevo` INT(11) NULL DEFAULT NULL,
`audi_fechaModificacion` DATETIME NULL,
`audi_usuario` VARCHAR(45) NULL,
`audi_incicodigo` INT NULL,
`audi_accion` VARCHAR(45) NULL,
PRIMARY KEY (`idaudi`));
6.6.1 Actualización
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.incidentes_BEFORE_UPDATE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`incidentes_BEFORE_UPDATE` BEFORE UPDATE ON
`incidentes` FOR EACH ROW
BEGIN
insert into auditoria_incidentes(audi_fechaAnterior, audi_placaAnterior,
audi_lugarAnterior, audi_heridosAnterior, audi_fatalidadesAnterior,
audi_involucradosAnterior, audi_fechaNuevo, audi_placaNuevo,
audi_lugarNuevo,
audi_heridosNuevo, audi_fatalidadesNuevo, audi_involucradosNuevo,
audi_fechaModificacion, audi_usuario, audi_incicodigo, audi_accion)
values(old.incifecha, old.inciplaca, old.incilugar, old.incicantheridos,
old.incicantfatalidades, old.incicanautosinvolucrados, new.incifecha, new.inciplaca,
new.incilugar, new.incicantheridos, new.incicantfatalidades,
new.incicanautosinvolucrados, now(), current_user(), incicodigo, 'Actualización');
END$$
DELIMITER ;
6.6.2 Eliminación de registros
USE `laboratoriosql`;
DELIMITER $$
DROP TRIGGER IF EXISTS laboratoriosql.incidentes_AFTER_DELETE$$
USE `laboratoriosql`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`laboratoriosql`.`incidentes_AFTER_DELETE` AFTER DELETE ON `incidentes`
FOR EACH ROW
BEGIN
insert into auditoria_incidentes(audi_fechaAnterior, audi_placaAnterior,
audi_lugarAnterior, audi_heridosAnterior, audi_fatalidadesAnterior,
audi_involucradosAnterior, audi_fechaModificacion, audi_usuario, audi_incicodigo,
audi_accion)
values(old.incifecha, old.inciplaca, old.incilugar, old.incicantheridos,
old.incicantfatalidades, old.incicanautosinvolucrados, now(), current_user(),
incicodigo, 'Registro eliminado');
END$$
DELIMITER ;
6.7 Disparador de actualización con Oracle (Tabla artículo)
Primero creamos la tabla auditoria_articulos:
6.7.1 Actualización
create or replace trigger "ACTUALIZAR_ARTICULO"
BEFORE
update on "ARTICULO"
for each row
begin
insert into auditoria_articulo(TITARTANTERIOR, AUTARTANTERIOR,
EDIARTANTERIOR, PRECARTANTERIOR, TITARTNUEVO, AUTARTNUEVO,
EDIARTNUEVO, PRECARTNUEVO, FECHAMODIFICACION, USUARIO,
IDART, ACCION)
values(:old.tit_art, :old.aut_art, :old.edi_art, :old.prec_art, :new.tit_art,
:new.aut_art, :new.edi_art, :new.prec_art, sysdate, user, :old.id_art, 'Actualización');
end;
Al editar un registro de la tabla artículo se crea el registro correspondiente en la tabla
de auditoría.
6.7.2 Eliminar registros
create or replace trigger "ELIMINAR_ARTICULO"
AFTER
delete on "ARTICULO"
for each row
begin
insert into auditoria_articulo(TITARTANTERIOR, AUTARTANTERIOR,
EDIARTANTERIOR, PRECARTANTERIOR, FECHAMODIFICACION,
USUARIO, IDART, ACCION)
values(:old.tit_art, :old.aut_art, :old.edi_art, :old.prec_art, sysdate, user, :old.id_art,
'Eliminación de registro');
end;
6.8 Disparadores para la tabla cliente
CREATE TABLE "AUDITORIA_CLIENTE"
( "NOMCLIANT" VARCHAR2(30),
"APECLIANT" VARCHAR2(30),
"DIRCLIANT" VARCHAR2(100),
"DEPCLIANT" VARCHAR2(20),
"MESANT" VARCHAR2(10),
"NOMCLINUE" VARCHAR2(30),
"APECLINUE" VARCHAR2(30),
"DIRCLINUE" VARCHAR2(100),
"DEPCLINUE" VARCHAR2(20),
"MESNUE" VARCHAR2(10),
"FECHAMOD" DATE,
"USUARIO" VARCHAR2(45),
"IDCLI" VARCHAR2(20),
"ACCION" VARCHAR2(45)
) ;
6.8.1 Actualizar
create or replace trigger "ACTUALIZAR_CLIENTE"
BEFORE
update on "CLIENTE"
for each row
begin
insert into auditoria_cliente(NOMCLIANT, APECLIANT, DIRCLIANT,
DEPCLIANT, MESANT, NOMCLINUE, APECLINUE, DIRCLINUE,
DEPCLINUE, MESNUE,FECHAMOD, USUARIO, IDCLI, ACCION)
values(:old.NOM_CLI, :old.APE_CLI, :old.DIR_CLI, :old.DEP_CLI,
:old.MES_CUM_CLI, :new.NOM_CLI, :new.APE_CLI, :new.DIR_CLI,
:new.DEP_CLI, :new.MES_CUM_CLI, sysdate, user, :old.ID_CLI, 'Actualizacion');
end;
6.8.2 Eliminar registros
create or replace trigger "ELIMINAR_CLIENTE"
AFTER
delete on "CLIENTE"
for each row
begin
insert into auditoria_cliente(NOMCLIANT, APECLIANT, DIRCLIANT,
DEPCLIANT, MESANT,FECHAMOD, USUARIO, IDCLI, ACCION)
values(:old.NOM_CLI, :old.APE_CLI, :old.DIR_CLI, :old.DEP_CLI,
:old.MES_CUM_CLI, sysdate, user, :old.ID_CLI, 'Actualizacion');
end;
6.9 Disparadores para la tabla pedido
CREATE TABLE "AUDITORIA_PEDIDO"
( "IDCLIPEDA" VARCHAR2(20),
"FECPEDA" DATE,
"VALPEDA" NUMBER,
"IDCLIPEDN" VARCHAR2(20),
"FECPEDN" DATE,
"VALPEDN" NUMBER,
"FECMOD" DATE,
"USUARIO" VARCHAR2(45),
"IDPED" NUMBER,
"ACCION" VARCHAR2(45)
);
6.9.1 Actualizar
create or replace trigger "ACTUALIZAR_PEDIDO"
BEFORE
update on "PEDIDO"
for each row
begin
INSERT INTO AUDITORIA_PEDIDO(IDCLIPEDA, FECPEDA, VALPEDA,
IDCLIPEDN, FECPEDN, VALPEDN, FECMOD, USUARIO, IDPED, ACCION)
VALUES(:OLD.ID_CLI_PED, :OLD.FEC_PED,
:OLD.VAL_PED,:NEW.ID_CLI_PED, :NEW.FEC_PED, :NEW.VAL_PED,
SYSDATE, USER,:OLD.ID_PED, 'Actualización');
end;
6.9.2 Eliminar registros
create or replace trigger "ELIMINAR_PEDIDO"
AFTER
delete on "PEDIDO"
for each row
begin
INSERT INTO AUDITORIA_PEDIDO(IDCLIPEDA, FECPEDA, VALPEDA,
FECMOD, USUARIO, IDPED, ACCION)
VALUES(:OLD.ID_CLI_PED, :OLD.FEC_PED, :OLD.VAL_PED, SYSDATE,
USER,:OLD.ID_PED, 'ELiminación registro');
end;

También podría gustarte