A continuación se presentan las instrucciones y el script de creación de la base de datos. Resuelva cada uno de los seis ejercicios implementando los objetos solicitados (funciones definidas por el usuario, vistas y procedimientos almacenados) utilizando exactamente los nombres indicados en cada consigna. Respete el manejo de errores y la auditoría especificada.
RESIGNAL, el error debe ser relanzado después de realizar el registro en la tabla de auditoría, de modo que el entorno que invocó al procedimiento reciba la notificación del error y pueda manejarlo si corresponde. Cuando se utilice SIGNAL para generar un error controlado, no es necesario relanzar nada adicional, ya que el error se produce en ese punto.
Ejecute el siguiente script para crear las tablas y cargar los datos de ejemplo.
CREATE DATABASE bdd2_integradores;
USE bdd2_integradores;
-- Tabla Clientes
CREATE TABLE Clientes (
cliente_id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50),
apellido VARCHAR(50),
ciudad VARCHAR(50),
email VARCHAR(50)
);
-- Tabla Productos
CREATE TABLE Productos (
producto_id INT PRIMARY KEY,
nombre_producto VARCHAR(50),
categoria VARCHAR(50),
precio DECIMAL(10, 2),
stock INT NOT NULL
);
-- Tabla Pedidos
CREATE TABLE Pedidos (
pedido_id INT PRIMARY KEY,
cliente_id INT,
fecha_pedido DATE,
FOREIGN KEY (cliente_id) REFERENCES Clientes(cliente_id)
);
-- Tabla Detalle_Pedido
CREATE TABLE Detalle_Pedido (
detalle_id INT PRIMARY KEY,
pedido_id INT,
producto_id INT,
cantidad INT,
FOREIGN KEY (pedido_id) REFERENCES Pedidos(pedido_id),
FOREIGN KEY (producto_id) REFERENCES Productos(producto_id)
);
-- Tabla Auditoria_Errores
CREATE TABLE Auditoria_Errores (
auditoria_id INT AUTO_INCREMENT PRIMARY KEY,
procedimiento VARCHAR(100),
operacion VARCHAR(100),
mensaje_error VARCHAR(255),
fecha_error DATETIME
);
-- Tabla para auditoría de operaciones masivas (Ejercicio 5)
CREATE TABLE Auditoria_Operaciones (
auditoria_op_id INT AUTO_INCREMENT PRIMARY KEY,
categoria VARCHAR(50),
fecha_operacion DATETIME,
cantidad_productos_actualizados INT
);
-- Tabla para alertas de stock (Ejercicio 6)
CREATE TABLE Alertas_Stock (
alerta_id INT AUTO_INCREMENT PRIMARY KEY,
producto_id INT,
stock_actual INT,
fecha_alerta DATETIME,
FOREIGN KEY (producto_id) REFERENCES Productos(producto_id)
);
-- Datos de ejemplo
INSERT INTO Clientes (nombre, apellido, ciudad, email) VALUES
('Ana', 'García', 'Madrid', 'ana.garcia@email.com'),
('Juan', 'Pérez', 'Barcelona', 'juan.perez@email.com'),
('María', 'López', 'Madrid', 'maria.lopez@email.com'),
('Carlos', 'Ruiz', 'Valencia', 'carlos.ruiz@email.com');
INSERT INTO Productos (producto_id, nombre_producto, categoria, precio, stock) VALUES
(1, 'Laptop', 'Electrónicos', 1200.00, 5),
(2, 'Tablet', 'Electrónicos', 300.00, 10),
(3, 'Libro', 'Libros', 25.00, 20),
(4, 'Smartphone', 'Electrónicos', 800.00, 8),
(5, 'Auriculares', 'Electrónicos', 150.00, 15),
(6, 'Monitor', 'Electrónicos', 400.00, 7);
INSERT INTO Pedidos (pedido_id, cliente_id, fecha_pedido) VALUES
(1, 1, '2023-10-26'),
(2, 1, '2023-11-10'),
(3, 2, '2023-11-05'),
(4, 3, '2023-10-28'),
(5, 4, '2023-11-15');
INSERT INTO Detalle_Pedido (detalle_id, pedido_id, producto_id, cantidad) VALUES
(1, 1, 1, 1),
(2, 1, 2, 2),
(3, 2, 4, 1),
(4, 3, 3, 3),
(5, 4, 1, 1),
(6, 5, 2, 2),
(7, 5, 4, 1);
Desarrollar un procedimiento almacenado que permita reponer el stock de un producto. El procedimiento deberá recibir un producto_id y una cantidad, verificar que el producto exista, obtener el stock actual, calcular el nuevo stock luego de la reposición y actualizar el valor en la tabla Productos.
Objetos a crear:
Si la operación se realiza correctamente, el procedimiento deberá informar un mensaje de éxito.
En caso de producirse un error, deberá generarse un error controlado mediante SIGNAL SQLSTATE '45000'. El procedimiento deberá incluir un HANDLER que capture dicho error, registre el motivo en la tabla Auditoria_Errores y luego no relance el error (el error ya ha sido manejado y el procedimiento termina normalmente con el mensaje de error).
Desarrollar un procedimiento almacenado que permita actualizar el precio de un producto aplicando un porcentaje de aumento. El procedimiento deberá recibir un producto_id y un porcentaje, verificar que el producto exista, obtener su precio actual, calcular el nuevo valor y actualizarlo en la tabla Productos.
Objetos a crear:
Si la operación se realiza correctamente, el procedimiento deberá informar un mensaje de éxito.
En caso de producirse un error, deberá generarse un error controlado mediante SIGNAL SQLSTATE '45000'. El procedimiento deberá incluir un HANDLER que capture dicho error, registre el motivo en la tabla Auditoria_Errores y luego no relance el error (el error ya ha sido manejado y el procedimiento termina normalmente con el mensaje de error).
Desarrollar un procedimiento almacenado que permita mostrar la información completa de un pedido. El procedimiento deberá recibir un pedido_id, verificar que dicho pedido exista y, en caso afirmativo, mostrar su identificador, la fecha en la que fue realizado, el nombre completo del cliente y el total del pedido. Si el pedido existe pero no tiene detalles asociados, el total debe mostrarse como 0 (cero).
Objetos a crear:
Detalle_Pedido y Productos.pedido_id, consulte la vista y retorne el total (0 si no tiene detalles).pedido_id y muestre los datos requeridos.En caso de que el pedido no exista, deberá generarse un error controlado mediante SIGNAL SQLSTATE '45000'. El procedimiento deberá incluir un HANDLER que capture dicho error, registre el motivo en la tabla Auditoria_Errores y luego no relance el error (el error ya ha sido manejado y el procedimiento termina normalmente con el mensaje de error).
Desarrollar un procedimiento almacenado que permita registrar un nuevo detalle de pedido controlando que el stock disponible del producto sea suficiente. El procedimiento deberá recibir detalle_id, pedido_id, producto_id y cantidad, verificar que el pedido y el producto existan, obtener el stock actual, validar que haya unidades suficientes, insertar el detalle en la tabla Detalle_Pedido y actualizar el stock del producto.
Objetos a crear:
Si la operación se realiza correctamente, el procedimiento deberá informar un mensaje de éxito.
En caso de producirse un error, deberá generarse un error controlado mediante SIGNAL SQLSTATE '45000'. El procedimiento deberá incluir un HANDLER que capture dicho error, registre el motivo en la tabla Auditoria_Errores y luego no relance el error (el error ya ha sido manejado y el procedimiento termina normalmente con el mensaje de error).
Desarrollar un procedimiento almacenado que aplique un descuento del 10% a todos los productos de una categoría determinada. El procedimiento deberá recibir el nombre de la categoría.
Objetos a crear:
p_categoria VARCHAR(50).Se solicita además:
SIGNAL SQLSTATE '45000'.Auditoria_Operaciones con la siguiente información: categoria, fecha_operacion y cantidad_productos_actualizados.SQLEXCEPTION), registre el error en Auditoria_Errores y luego utilice RESIGNAL para relanzar el mismo error. El error relanzado debe propagarse al entorno que llamó al procedimiento.El procedimiento debe informar un mensaje de éxito si la operación se completa correctamente.
Desarrollar un procedimiento almacenado que reciba un producto_id y muestre su nombre y stock actual.
Objetos a crear:
p_producto_id INT.producto_id y stock_actual, y registre una alerta en la tabla Alertas_Stock.Se solicita además:
SELECT ... INTO para obtener el nombre y stock del producto.HANDLER FOR NOT FOUND que, en caso de que el producto no exista (el SELECT ... INTO no encuentre filas), inserte un registro en Auditoria_Errores indicando "Producto no encontrado" y luego lance un error controlado con SIGNAL SQLSTATE '45000'. Este error no debe ser relanzado adicionalmente, ya que el SIGNAL ya produce la excepción.SQLEXCEPTION) que registre en Auditoria_Errores y luego use RESIGNAL para relanzar el error al entorno invocante.Nota: La tabla Alertas_Stock ya fue creada en el script inicial.