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
- Disparadores DML: Se activan en respuesta a eventos DML (
INSERT
,UPDATE
,DELETE
). - Disparadores DDL: Se activan en respuesta a eventos DDL (Data Definition Language) como
CREATE
,ALTER
,DROP
. - 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 tablaemployees
. - 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 columnasalary
de la tablaemployees
. - :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
- 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. - 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.
- 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.
Curso de PL/SQL
Módulo 1: Introducción a PL/SQL
Módulo 2: Fundamentos de PL/SQL
- Estructura del Bloque PL/SQL
- Variables y Tipos de Datos
- Estructuras de Control
- Cursores
- Manejo de Excepciones