Automatización de Triggers en PostgreSQL

PostgreSQLBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá cómo automatizar tareas en PostgreSQL utilizando triggers (disparadores). El laboratorio se centra en la creación de una función trigger (función disparadora) utilizando PL/pgSQL para registrar automáticamente los cambios de salario en una tabla employees (empleados) en una tabla separada salary_changes (cambios de salario).

Se le guiará a través de la escritura de la función trigger, vinculándola a un evento de tabla (específicamente, una actualización en la tabla employees), probando el comportamiento del trigger y, finalmente, desactivando y eliminando el trigger.

Crear Tablas y la Función Trigger (Disparador)

En este paso, creará las tablas employees (empleados) y salary_changes (cambios de salario), y luego definirá la función log_salary_change (registrar_cambio_salario) utilizando PL/pgSQL.

Primero, conéctese a la base de datos PostgreSQL como el usuario postgres:

sudo -u postgres psql

Ahora, cree la tabla employees:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

Este comando crea una tabla con una columna id (clave primaria), name (nombre) y salary (salario).

A continuación, cree la tabla salary_changes para almacenar el historial de cambios de salario:

CREATE TABLE salary_changes (
    id SERIAL PRIMARY KEY,
    employee_id INTEGER,
    old_salary DECIMAL(10, 2),
    new_salary DECIMAL(10, 2),
    change_date TIMESTAMP
);

Ahora, escribamos la función trigger utilizando PL/pgSQL. Esta función se ejecutará antes de una operación de actualización (update) en la tabla employees. Registrará los valores de salario antiguo y nuevo en la tabla salary_changes.

CREATE OR REPLACE FUNCTION log_salary_change()
RETURNS TRIGGER AS $$
BEGIN
    IF OLD.salary <> NEW.salary THEN
        INSERT INTO salary_changes (employee_id, old_salary, new_salary, change_date)
        VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Este código define una función llamada log_salary_change. Comprueba si el salario ha cambiado. Si lo ha hecho, inserta una nueva fila en la tabla salary_changes con el ID del empleado, el salario antiguo, el salario nuevo y la marca de tiempo (timestamp) actual.

Crear el Trigger (Disparador)

En este paso, vinculará la función log_salary_change (registrar_cambio_salario) a la tabla employees (empleados) para que se ejecute automáticamente cuando se produzca una actualización de salario.

Cree el trigger utilizando el siguiente comando SQL:

CREATE TRIGGER salary_change_trigger
BEFORE UPDATE ON employees
FOR EACH ROW
EXECUTE FUNCTION log_salary_change();

Este comando crea un trigger llamado salary_change_trigger (disparador_cambio_salario). Especifica que el trigger debe activarse antes de una operación UPDATE (actualización) en la tabla employees. La cláusula FOR EACH ROW (para cada fila) indica que la función trigger debe ejecutarse para cada fila que se actualice.

Probar el Trigger (Disparador)

En este paso, probará el comportamiento del trigger (disparador). Insertará datos en la tabla employees (empleados) y luego actualizará el salario para ver si el trigger registra correctamente los cambios en la tabla salary_changes (cambios_de_salario).

Primero, inserte algunos datos iniciales en la tabla employees:

INSERT INTO employees (name, salary) VALUES ('Alice', 50000.00);
INSERT INTO employees (name, salary) VALUES ('Bob', 60000.00);

Ahora, actualice el salario de Alice:

UPDATE employees SET salary = 55000.00 WHERE name = 'Alice';

Para verificar que el trigger funcionó correctamente, consulte la tabla salary_changes:

SELECT * FROM salary_changes;

Debería ver una fila en la tabla salary_changes con la información sobre el cambio de salario de Alice.

A continuación, actualice el salario de Bob al mismo valor que ya tiene:

UPDATE employees SET salary = 60000.00 WHERE name = 'Bob';

Dado que el salario no está cambiando realmente, el trigger no debería insertar una nueva fila en la tabla salary_changes. Verifiquemos esto:

SELECT * FROM salary_changes;

Aún debería ver solo la fila relacionada con el cambio de salario de Alice.

Finalmente, inserte un nuevo empleado:

INSERT INTO employees (name, salary) VALUES ('Charlie', 70000.00);

Insertar un nuevo empleado no debería activar el trigger log_salary_change (registrar_cambio_salario), ya que solo está configurado para activarse en eventos UPDATE (actualización). Confirmemos esto revisando la tabla salary_changes nuevamente:

SELECT * FROM salary_changes;

Aún debería ver solo la fila relacionada con el cambio de salario de Alice.

Deshabilitar y Eliminar el Trigger (Disparador)

En este paso, aprenderá cómo deshabilitar y eliminar un trigger (disparador) en PostgreSQL.

Primero, deshabilite el salary_change_trigger (disparador_cambio_salario):

ALTER TABLE employees DISABLE TRIGGER salary_change_trigger;

Ahora, actualice el salario de Alice nuevamente:

UPDATE employees SET salary = 60000.00 WHERE name = 'Alice';

Verifique la tabla salary_changes (cambios_de_salario):

SELECT * FROM salary_changes;

Aún debería ver solo la fila de la actualización anterior. Esto confirma que el trigger está deshabilitado.

Para volver a habilitar el trigger, puede usar el siguiente comando:

ALTER TABLE employees ENABLE TRIGGER salary_change_trigger;

Finalmente, para eliminar permanentemente el trigger, elimínelo usando el siguiente comando:

DROP TRIGGER salary_change_trigger ON employees;

Resumen

En este laboratorio, aprendió cómo automatizar tareas en PostgreSQL utilizando triggers (disparadores). Creó una función de trigger utilizando PL/pgSQL para registrar los cambios de salario en una tabla employees (empleados) en una tabla salary_changes (cambios_de_salario). Escribió la función, la vinculó a un evento de tabla, la probó y la deshabilitó/eliminó.