Introducción a los Disparadores

Los disparadores (triggers) en PL/SQL son bloques de código que se ejecutan automáticamente en respuesta a ciertos eventos en una tabla o vista. Estos eventos pueden ser operaciones DML (Data Manipulation Language) como INSERT, UPDATE o DELETE. Los disparadores son útiles para mantener la integridad de los datos, auditar cambios y automatizar tareas.

Tipos de Disparadores

  1. Disparadores DML: Se activan en respuesta a eventos DML (INSERT, UPDATE, DELETE).
  2. Disparadores DDL: Se activan en respuesta a eventos DDL (Data Definition Language) como CREATE, ALTER, DROP.
  3. Disparadores de Base de Datos: Se activan en respuesta a eventos de la base de datos como LOGON, LOGOFF, STARTUP, SHUTDOWN.

Sintaxis Básica de un Disparador DML

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} 
{INSERT | UPDATE [OF column_name] | DELETE}
ON table_name
[FOR EACH ROW]
DECLARE
    -- Declaración de variables
BEGIN
    -- Código PL/SQL
END;

Ejemplo Práctico: Disparador de Auditoría

Vamos a crear un disparador que registre cada vez que se inserta un nuevo registro en una tabla de empleados.

Paso 1: Crear la Tabla de Auditoría

CREATE TABLE employee_audit (
    audit_id NUMBER PRIMARY KEY,
    employee_id NUMBER,
    action VARCHAR2(50),
    action_date DATE
);

Paso 2: Crear el Disparador

CREATE OR REPLACE TRIGGER trg_employee_audit
AFTER INSERT ON employees
FOR EACH ROW
DECLARE
BEGIN
    INSERT INTO employee_audit (audit_id, employee_id, action, action_date)
    VALUES (employee_audit_seq.NEXTVAL, :NEW.employee_id, 'INSERT', SYSDATE);
END;

Explicación del Código

  • AFTER INSERT ON employees: El disparador se ejecutará después de una operación INSERT en la tabla employees.
  • FOR EACH ROW: El disparador se ejecutará una vez por cada fila afectada.
  • :NEW.employee_id: Hace referencia al valor del employee_id en la nueva fila que se está insertando.
  • SYSDATE: Función que devuelve la fecha y hora actuales del sistema.

Ejercicio Práctico

Ejercicio: Crea un disparador que registre cada vez que se actualiza el salario de un empleado en una tabla de auditoría.

Paso 1: Crear la Tabla de Auditoría

CREATE TABLE salary_audit (
    audit_id NUMBER PRIMARY KEY,
    employee_id NUMBER,
    old_salary NUMBER,
    new_salary NUMBER,
    action_date DATE
);

Paso 2: Crear el Disparador

CREATE OR REPLACE TRIGGER trg_salary_audit
AFTER UPDATE OF salary ON employees
FOR EACH ROW
DECLARE
BEGIN
    INSERT INTO salary_audit (audit_id, employee_id, old_salary, new_salary, action_date)
    VALUES (salary_audit_seq.NEXTVAL, :OLD.employee_id, :OLD.salary, :NEW.salary, SYSDATE);
END;

Solución del Ejercicio

  • AFTER UPDATE OF salary ON employees: El disparador se ejecutará después de una operación UPDATE en la columna salary de la tabla employees.
  • :OLD.salary: Hace referencia al valor antiguo del salary antes de la actualización.
  • :NEW.salary: Hace referencia al nuevo valor del salary después de la actualización.

Errores Comunes y Consejos

  1. Olvidar el FOR EACH ROW: Si se omite, el disparador no se ejecutará por cada fila afectada, sino una sola vez por la operación.
  2. No manejar excepciones: Siempre es una buena práctica manejar posibles excepciones dentro del disparador para evitar que errores inesperados interrumpan la operación DML.
  3. Uso excesivo de disparadores: Los disparadores pueden afectar el rendimiento si se usan en exceso. Úsalos con moderación y solo cuando sea necesario.

Conclusión

En esta sección, hemos aprendido qué son los disparadores en PL/SQL, cómo se estructuran y cómo se pueden utilizar para automatizar tareas y mantener la integridad de los datos. Hemos visto ejemplos prácticos y hemos creado un disparador de auditoría. En el siguiente módulo, profundizaremos en técnicas de optimización y mejores prácticas para escribir código PL/SQL eficiente.

© Copyright 2024. Todos los derechos reservados