Implementación de Paquetes PL/SQL para Gestión Salarial y Auditoría con Triggers en Oracle
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 5,63 KB
Requerimientos del Ejercicio
El objetivo de este ejercicio es desarrollar componentes de base de datos en PL/SQL para gestionar aumentos salariales y auditar los cambios realizados en la tabla employees.
- Paquete PL/SQL: Crear un paquete llamado
aumento_sueldoque contenga:- Función
subida_empleado: Recibe el ID del empleado y el porcentaje de subida. Actualiza el salario del empleado específico. Retorna un booleano indicando el éxito de la operación. - Procedimiento
subida_sueldo: Recibe un salario base y un porcentaje de subida. Este procedimiento realizará la subida del porcentaje a todos los sueldos que superen el salario pasado como parámetro.
- Función
- Disparador (Trigger) de Auditoría: Se creará un disparador que audite las modificaciones realizadas en la columna
salary, registrando en una tabla de auditoría los siguientes datos: usuario, salario antiguo, salario nuevo, fecha, nombre del empleado.
Implementación en PL/SQL
1. Desarrollo del Paquete aumento_sueldo
1.1. Especificación del Paquete
Se define la interfaz pública del paquete, declarando la función y el procedimiento requeridos.
CREATE OR REPLACE PACKAGE aumento_sueldo IS
FUNCTION subida_empleado (porcentaje NUMBER, id_empleado employees.employee_id%TYPE) RETURN BOOLEAN;
PROCEDURE subida_sueldo (porcentaje NUMBER, salario employees.salary%TYPE);
END aumento_sueldo;
1.2. Cuerpo del Paquete (PACKAGE BODY)
Se implementa la lógica de negocio para la actualización salarial.
Función subida_empleado
CREATE OR REPLACE PACKAGE BODY aumento_sueldo IS
FUNCTION subida_empleado (porcentaje NUMBER, id_empleado employees.employee_id%TYPE) RETURN BOOLEAN IS
salida BOOLEAN := TRUE;
BEGIN
UPDATE employees
SET salary = salary * (1 + porcentaje / 100)
WHERE employee_id = id_empleado;
IF SQL%NOTFOUND THEN
salida := FALSE;
END IF;
RETURN salida;
END subida_empleado;
Procedimiento subida_sueldo
Dado que la subida afecta a múltiples empleados, se utiliza un cursor explícito para iterar sobre aquellos que cumplen la condición salarial.
PROCEDURE subida_sueldo (porcentaje NUMBER, salario employees.salary%TYPE) IS
-- Declaración del cursor para seleccionar empleados con salario superior o igual al umbral
CURSOR c_almacen IS
SELECT employee_id, salary, first_name
FROM employees
WHERE salary >= salario;
-- Variable para almacenar los valores de cada fila del cursor
vr_almacen c_almacen%ROWTYPE;
salida BOOLEAN := FALSE;
BEGIN
OPEN c_almacen;
FETCH c_almacen INTO vr_almacen;
-- Recorrido del cursor mediante %FOUND
WHILE (c_almacen%FOUND) LOOP
-- Llamada a la función para actualizar el salario
salida := subida_empleado(porcentaje, vr_almacen.employee_id);
-- Si la actualización fue exitosa, se muestra un mensaje
IF (salida) THEN
dbms_output.put_line('Modificado: ' || vr_almacen.first_name || ' (ID: ' || vr_almacen.employee_id || ')');
END IF;
-- Recuperación de la siguiente fila
FETCH c_almacen INTO vr_almacen;
END LOOP;
CLOSE c_almacen;
END subida_sueldo;
END aumento_sueldo;
-- Fin del cuerpo del paquete
2. Implementación de la Auditoría (Tabla y Trigger)
2.1. Creación de la Tabla de Auditoría
Se crea la tabla auditar para registrar los cambios en la columna salary.
CREATE TABLE auditar (
usuario VARCHAR2(30),
my_date DATE,
old_sal NUMBER(8,2),
new_salary NUMBER(8,2),
nombre VARCHAR2(30)
);
2.2. Creación del Disparador (Trigger)
El disparador se activa después de cualquier actualización en la columna salary, registrando los valores antiguos y nuevos por cada fila modificada.
CREATE OR REPLACE TRIGGER mitrigger
AFTER UPDATE OF salary ON employees
FOR EACH ROW -- El trigger se ejecuta por cada registro que se modifique
BEGIN
INSERT INTO auditar (usuario, my_date, old_sal, new_salary, nombre)
VALUES (USER, SYSDATE, :OLD.salary, :NEW.salary, :OLD.first_name);
END;
Pruebas y Verificación
1. Prueba de Ejecución del Paquete
Se habilita la salida de servidor y se ejecuta el procedimiento para aplicar un aumento del 10% a todos los empleados con salario igual o superior a 10000.
SET SERVEROUTPUT ON
EXECUTE aumento_sueldo.subida_sueldo(10, 10000);
2. Verificación de la Auditoría
2.1. Comprobación inicial de la tabla de auditoría
Verificamos el estado inicial de la tabla auditar.
SELECT * FROM AUDITAR;
2.2. Ejecución del Paquete (Segunda Ejecución)
Se ejecuta nuevamente el procedimiento para generar las modificaciones y activar el trigger, registrando los cambios en la tabla de auditoría.
SET SERVEROUTPUT ON
EXECUTE aumento_sueldo.subida_sueldo(10, 10000);
2.3. Verificación final de la tabla de auditoría
Se comprueba que la tabla auditar se ha llenado con los registros correspondientes a las modificaciones salariales.
SELECT * FROM AUDITAR;