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;