-- Cambiar el delimitador a //
DELIMITER //
-- Procedimiento para crear un usuario y conceder permisos
CREATE PROCEDURE CreateUserAndGrantPermissions()
BEGIN
-- Crear un nuevo usuario con permisos limitados
CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'password';
-- Conceder permisos solo para ejecutar procedimientos almacenados
GRANT EXECUTE ON PROCEDURE * TO 'user_name'@'localhost';
END //
-- Procedimiento para obtener datos de empleados con control de acceso
CREATE PROCEDURE SecureGetEmpleadoById(IN id INT)
BEGIN
IF USER() = 'admin_user' THEN
SELECT * FROM Empleados WHERE CodEmpleado = id;
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Acceso denegado';
END IF;
END //
-- Procedimiento para consultar nóminas con filtros
CREATE PROCEDURE GetNominasWithFilters(IN startDate DATE, IN endDate DATE)
BEGIN
SELECT * FROM Nominas
WHERE Fecha BETWEEN startDate AND endDate;
END //
-- Procedimiento para buscar beneficios por nombre
CREATE PROCEDURE SearchBeneficiosByName(IN benefitName VARCHAR(255))
BEGIN
SELECT * FROM Beneficios
WHERE nombre LIKE CONCAT('%', benefitName, '%');
END //
-- Procedimiento para actualizar datos de empleados
CREATE PROCEDURE UpdateEmpleado(IN id INT, IN newName VARCHAR(255), IN newPosition VARCHAR(255))
BEGIN
UPDATE Empleados
SET nombre = newName, cargo = newPosition
WHERE CodEmpleado = id;
END //
-- Procedimiento para insertar nueva nómina
CREATE PROCEDURE InsertNewNomina(IN fecha DATE, IN salario DECIMAL(10,2), IN empleadoId INT)
BEGIN
INSERT INTO Nominas (Fecha, Salario, CodEmpleado)
VALUES (fecha, salario, empleadoId);
END //
-- Procedimiento para eliminar beneficio
CREATE PROCEDURE DeleteBeneficio(IN benefitId INT)
BEGIN
IF (SELECT COUNT(*) FROM BeneficioNomina WHERE CodBeneficio = benefitId) = 0 THEN
DELETE FROM Beneficios WHERE CodBeneficio = benefitId;
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Beneficio no se puede eliminar porque está en uso';
END IF;
END //
-- Procedimiento para obtener nómina con detalles
CREATE PROCEDURE GetNominaDetails(IN id INT)
BEGIN
SELECT n.*, dn.monto AS DeduccionMonto, bn.monto AS BeneficioMonto
FROM Nominas n
LEFT JOIN DeduccionNomina dn ON n.CodNomina = dn.CodNomina
LEFT JOIN BeneficioNomina bn ON n.CodNomina = bn.CodNomina
WHERE n.CodNomina = id;
END //
-- Procedimiento para obtener empleados con deducciones y beneficios
CREATE PROCEDURE GetEmpleadosDeduccionesBeneficios()
BEGIN
SELECT e.nombre, e.apellido, SUM(dn.monto) AS TotalDeducciones, SUM(bn.monto) AS TotalBeneficios
FROM Empleados e
LEFT JOIN DeduccionNomina dn ON e.CodEmpleado = dn.CodEmpleado
LEFT JOIN BeneficioNomina bn ON e.CodEmpleado = bn.CodEmpleado
GROUP BY e.CodEmpleado;
END //
-- Volver a establecer el delimitador a ;
DELIMITER ;