Está en la página 1de 18

Jersson Andres Garzon Moros.

Ingeniería de Sistemas.
Universidad Minuto de Dios.
Ing. Segundo Fidel Puerto Garavito.
Sistemas Transaccionales.

Vamos a trabajar con triggers:


a. Creamos una base de datos llamada ejemplo y le decimos que queremos
trabajar con ella.

CREATE DATABASE IF NOT EXISTS ejemplo;

USE ejemplo;

b. Crearemos 2 tablas, en una guardamos datos de las personas y en la otra


cuando se ha introducido cada dato.
Persona (Código, nombre, edad) y Nuevosdatos (Código, cuando, tipo)

CREATE table IF NOT EXISTS persona(

id INT NOT NULL auto_increment,

nombre varchar(40),

edad int,

primary key (id)

);

CREATE table IF NOT EXISTS nuevosdatos(

codigo INT NOT NULL,

cuando datetime,

tipo varchar(2)

);
c. Crear un trigger para que se añada un dato en la segunda tabla cada vez que
insertemos en la primera. El trigger saltará con un AFTER INSERT, los datos que
introduzcamos serán: el código de la persona, la fecha actual y la letra "i" para
indicar que el cambio ha sido la inserción de un dato nuevo. Cada vez que
insertemos datos, debemos realizar una consulta para que nos muestre los datos
insertados.

DELIMITER %%

CREATE TRIGGER insert_persona

AFTER INSERT ON persona

FOR EACH ROW

BEGIN

INSERT INTO nuevosdatos(id_codigo, cuando, tipo) VALUES (new.id, curdate(), "i");

END%%

d. Crear un trigger que cuente los registros de la tabla employees y mantenga ese
numero actualizado en una tabla llamada cuenta, este trigger actuara después de
una instrucción insert o delete ejemplo si se introduce un registro nuevo en la tabla
aumentará en uno el contador, si se elimina un registro se disminuirá en uno el
contador.
CREATE table IF NOT EXISTS empleados(

id INT NOT NULL auto_increment, create table cuenta(

nombre varchar(40), contador int

edad int, );

direccion varchar(40),

primary key (id)

);

DELIMITER %%

create trigger delete_empleados

AFTER delete on empleados

for each row

begin

update cuenta set contador = (contador - 1);

end %%

DELIMITER %%

create trigger insert_empleados

AFTER insert on empleados

for each row

begin

update cuenta set contador = (contador + 1);

end %%
e. Crear un trigger que cada vez que se inserte un producto, en la tabla productos,
este vaya contando en otra tabla el número de productos insertados y otro trigger
para que cada vez que se elimine vaya descontando.

CREATE table IF NOT EXISTS producto(

id INT NOT NULL auto_increment,

nombre varchar(20), create table stock(

categoria varchar(40), cuenta int

primary key (id) );

);
DELIMITER %%

create trigger delete_productos

AFTER delete on producto

for each row

begin

update stock set contador = (contador - 1);

end %%

DELIMITER %%

create trigger insert_producto

AFTER insert on producto

for each row

begin

update stock set contador = (contador + 1);

end %%
f. Crear un trigger que cada vez que se elimine almacene la información del
producto, ver ejercicio e, en otra tabla con la fecha y la hora de la eliminación.

DELIMITER //

create trigger control

after delete on producto

for each row

begin

insert into respaldo(nombre, fecha) values (old.nombre, old.categoria, now());

end;

g. Compra y venta Cree una tabla llamada productos(puede utilizar la tabla del
caso e) Cree una tabla ventas (codventa, codigodelproducto,fecha, valorunitario,
cantidad) Cree una tabla compras (codcompra, codigodelproducto, fecha,
valorunitario, cantidad). Cree un trigger que cada vez que se inserte una compra
actualice (aumente) la cantidad en la tabla producto. Cree un trigger que cada vez
que se inserte una venta actualice (disminuya) la cantidad en la tabla producto.
DELIMITER %%

create trigger venta_productos

after insert on ventas

for each row

begin

UPDATE producto SET cantidad = cantidad - new.cantidades_vendidas

WHERE (id = new.codigodelproducto);

end;
DELIMITER %%

create trigger compra_productos

after insert on compras

for each row

begin

UPDATE producto SET cantidad = cantidad + new.cantidades_compradas

WHERE (id = new.codigodelproducto);

end;
h. Auditoria.

DELIMITER //

create trigger auditoria

after insert on ventas

for each row

insert into auditoria(codigo, producto, tipo, fecha, usuario) values (new.codventa,


new.codigodelproducto, 'Venta', curdate(),current_user());

//

DELIMITER //

create trigger auditoria_compras

after insert on compras

for each row

insert into auditoria(codigo, producto, tipo, fecha, usuario) values


(new.codventa, new.codigodelproducto, 'Compra', curdate(),current_user());

//
a. Cree una tabla clientes con los siguientes campos (documento, nombre,
apellido, saldo).

b. Cree una tabla pagos (código, codcliente, fecha, valor).

c. Cree una tabla créditos (código, codcliente, fecha, valor).


d. Cree un trigger que antes de insertar un crédito aumente el saldo del cliente.

DELIMITER %%

create trigger aumenta_saldo

before insert on credito

for each row

begin

UPDATE cliente set saldo = saldo + new.valor where documento =


new.id_cliente;

end%%

e. Cree un trigger que antes de insertar un pago disminuya el saldo del cliente.

DELIMITER $$
create trigger disminuir_saldo
before insert on pagos
for each row
begin
UPDATE cliente set saldo = saldo - new.valor where documento =
new.id_cliente;
end
$$

f. Cree una trigger que cada vez que se inserte, se actualice o elimine en
cualquiera de las tres tablas, guarde información en una tabla que se llame auditoria
con los siguientes campos(Evento,nombredetabla, código, fecha, hora) Evento:
inserción, actualización o eliminación Nombredelatabla: la tabla que será afectada
codigo: la llave primaria de lo que se está afectando. Fecha y hora: son tomados del
sistema.
• Credito.

DELIMITER //
create trigger insertar_credito
after insert on credito
for each row
INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES
('Credito', 'Inserta', codigo, curdate());
//

DELIMITER //
create trigger actua_credito
after update on credito
for each row
INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES
('Credito', 'actualizacion', codigo, curdate());
//

DELIMITER //
create trigger borrar_credito
after delete on credito
for each row
INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES
('Credito', 'Borrar', codigo, curdate());
//
• Cliente
DELIMITER //

create trigger insertar_cliente

after insert on cliente

for each row

INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES ('Cliente', 'Inserta',new.
id, curdate());

//

DELIMITER //

create trigger actua_cliente

after update on cliente

for each row

INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES ('Cliente', 'actualizacion',
old.id, curdate());

//

DELIMITER //

create trigger borrar_cliente

after delete on cliente

for each row

INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES ('Cliente', 'Borrar',
new.id, curdate());

//
• Pago

DELIMITER //

create trigger insertar_pago

after insert on pagos

for each row

INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES ('Pago', 'Inserta', codigo,
curdate());

//

DELIMITER //

create trigger borrar_pago

after delete on pagos

for each row

INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES ('pago', 'Borrar', codigo,
curdate());

//

DELIMITER //

create trigger actua_pago

after update on pagos

for each row

INSERT INTO auditoria1 (nombretabla, evento, codigo, fecha) VALUES ('pago', 'actualizacion',
codigo, curdate());

//
Funciones
1. (20%) Cree una función que calcule el área de la casa teniendo en cuenta que es
el área en metros cuadrado de la casa.

DELIMITER $$

create function calcularArea(largo int, ancho int)

returns varchar(30)

begin

declare area int;

set area = concat("El area es:", largo * ancho);

return area();

end $$

select *, calculararea(Largo, Ancho) as Area from casa

2. (20%) Cree una función que calcule el perímetro de la casa.

DELIMITER $$

create function calcularperimetro(largo int, ancho int)

returns varchar(30)

begin

declare perimetro int;

set perimetro = concat("El perimetro es:", (largo*2) + (ancho*2));

return perimetro();

end $$

select *, calcularperimetro(Largo, Ancho) as Perimetro from casa

3. (20%) Cree una función que calcule el valor de la casa teniendo en cuenta que
recibe tres parámetros el largo, el ancho y el valor del metro cuadrado. El valor es el
área por el valor del metro cuadrado. (10%) Llame al método que calcula el área.
DELIMITER $$

create function calcularValorCasa(valor_largo int, valor_ancho int, valor_metro int)

returns varchar(30)

begin

declare valor varchar(30);

set valor = calculararea(valor_largo, valor_ancho)*valor_metro;

return valor();

end$$

4. (30%) Construya un procedimiento que almacene en la tabla casa ya con la


información calculada (llame a las funciones necesarias). Tenga en cuenta lo
siguiente para llamar la función que calcula el valor de la casa primero debe buscar
el valor guardado en valor metro.

DELIMITER $$

CREATE FUNCTION calcularCasa (ancho float, largo float, valorm2 float)

RETURNS float

BEGIN

DECLARE valort float;

SET valort = (ancho * largo) * valorm2;

RETURN valort;

END$$

SELECT *, calcularCasa(ancho, largo, valorm2) AS valort FROM casa;


Procedimientos
Dada la siguiente tabla persona (peso, estado) Realice un procedimiento para
determinar si la persona puede donar sangre, si el peso el menor a 50 guarde en
estado “no admitido”, en caso contrario seria “admitido”. Dada la siguiente tabla
clientes (cedula, nombre, apellido) Cree procedimientos para los siguientes casos
DELIMITER $$

create procedure donarsangre(in pesopersona double)

begin
IF pesopersona > 50 then

insert into persona(peso, estado) values(pesopersona, 'admitido');

else

insert into persona(peso, estado) values(pesopersona, 'no admitido');

end if;

end$$

1. Que inserte información en la tabla clientes. Ayuda(recibe tres parámetros de


entrada)

DELIMITER $$

create procedure insertarinfo (in cedulacliente int, in nombrecliente varchar(20), in


apellidocliente varchar(30))

begin

insert into cliente(cedula, nombre, apellido) values (cedulacliente, nombrecliente,


apellidocliente);

end $$

2. Que actualice el nombre de un cliente. Ayuda (recibe dos parámetros, numero


de cedula de quien se va actualizar y el nuevo nombre)
delimiter $$

create procedure actualizar(in cedulacliente int, in nuevonombrecliente varchar(20))

begin

update donasangre.clientes set nombre = nuevonombrecliente where cedula = cedulacliente;

end $$

3. Que elimine un cliente. Ayuda (recibe un parámetro, numero de cedula de


quien se va eliminar.

delimiter $$

create procedure eliminar(in cedulacliente int)

begin

delete from clientes where cedula = cedulacliente;

end $$

4. Investigar procedimientos con paramentaros de salida.

El comportamiento común de un parámetro es como entrada, ésto quiere decir que recibirá
un dato almacenado en el parámetro enviado desde el contexto en el que se llama a la
función. Si deseamos indicar explícitamente que deseamos el parámetro como de entrada
debemos adicionar la palabra reservada IN a la declaración del parámetro de la función.

Los parámetros de salida permiten modificar el valor de una variable externa a la función
relacionada con el parámetro. De ésta manera si la función modifica el valor del parámetro,
la variable relacionada a éste parámetro tendrá el valor modificado inclusive después de
que la función haya terminado de ejecutarse.

En cada función o procedimiento que contenga parámetros de salida, éstos, son establecidos
con valores NULL al inicio de las funciones o procedimientos. ésto quiere decir que si
deseamos pasar un valor desde la variable externa relacionada al parámetro, éste valor, será
reemplazado con NULL antes de iniciar la función o procedimiento.

5. Investigar cómo hacer un ciclo (while).


Un bucle que hace que un procedimiento se repita mientras se de una condición. Si la
condición ya no se da antes de entrar al bucle, no entra.
delimiter $$

CREATE procedure ej(IN val int) /* Parámetro de entrada */

begin

define i int;

set i = 0;

while i<5 do

INSERT INTO prueba VALUES (i);

set i=i+1;

end while;

end$$

También podría gustarte