Procedimientos Almacenados y Consultas SQL

Procedimientos Almacenados

-- 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 ;
                

Procedimientos con Selects

-- Procedimiento para obtener datos de empleados con filtros
CREATE PROCEDURE GetEmpleadosFiltered(IN nombre VARCHAR(100))
BEGIN
    SELECT * FROM Empleados
    WHERE nombre LIKE CONCAT('%', nombre, '%');
END //

-- Procedimiento para obtener todos los cargos
CREATE PROCEDURE GetAllCargos()
BEGIN
    SELECT * FROM Cargos;
END //

-- Procedimiento para obtener beneficios específicos
CREATE PROCEDURE GetBeneficiosByType(IN tipo VARCHAR(50))
BEGIN
    SELECT * FROM Beneficios
    WHERE tipo = tipo;
END //

-- Procedimiento para obtener todos los departamentos
CREATE PROCEDURE GetAllDepartamentos()
BEGIN
    SELECT * FROM Departamentos;
END //

-- Procedimiento para obtener detalles de pagos por nómina
CREATE PROCEDURE GetPagosByNomina(IN CodNomina INT)
BEGIN
    SELECT * FROM Pagos
    WHERE CodNomina = CodNomina;
END //

-- Procedimiento para obtener deducciones específicas
CREATE PROCEDURE GetDeduccionesByType(IN tipo VARCHAR(50))
BEGIN
    SELECT * FROM Deducciones
    WHERE tipo = tipo;
END //

-- Procedimiento para obtener asignaciones de cargos
CREATE PROCEDURE GetEmpleadoCargoByEmpleado(IN CodEmpleado INT)
BEGIN
    SELECT * FROM EmpleadoCargo
    WHERE CodEmpleado = CodEmpleado;
END //

-- Procedimiento para obtener detalles de nómina por empleado
CREATE PROCEDURE GetNominaDetailsByEmpleado(IN CodEmpleado 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 dn.CodEmpleado = CodEmpleado;
END //

-- Procedimiento para obtener todos los pagos
CREATE PROCEDURE GetAllPagos()
BEGIN
    SELECT * FROM Pagos;
END //

-- Procedimiento para obtener deducciones de nómina
CREATE PROCEDURE GetDeduccionesNomina(IN CodNomina INT)
BEGIN
    SELECT * FROM DeduccionNomina
    WHERE CodNomina = CodNomina;
END //
                

Consultas SELECT

-- Obtener todos los empleados
SELECT * FROM Empleados;

-- Obtener todos los cargos
SELECT * FROM Cargos;

-- Obtener todos los beneficios
SELECT * FROM Beneficios;

-- Obtener todos los departamentos
SELECT * FROM Departamentos;

-- Obtener todos los pagos
SELECT * FROM Pagos;

-- Obtener todas las deducciones
SELECT * FROM Deducciones;

-- Obtener todas las nóminas
SELECT * FROM Nominas;

-- Obtener todas las deducciones de nómina
SELECT * FROM DeduccionNomina;

-- Obtener todos los beneficios de nómina
SELECT * FROM BeneficioNomina;

-- Obtener todas las asignaciones de cargos
SELECT * FROM EmpleadoCargo;