Está en la página 1de 2

POSTGRESQL PL/PGSQL - FUNCIONES DE TRIGGERS

DESCRIPCI�N DEL V�DEO


Funciones de disparadores (triggers)

Contienen, com�nmente en un lenguaje procedimental (como PL/pgSQL), la definici�n


de las operaciones a ejecutar seg�n las condiciones definidas en un disparador

Tienen acceso a datos especiales sobre el disparador que las invoca y las
estructuras/filas afectadas. Los m�s usados son:
NEW, OLD
TG_NAME
TG_WHEN (BEFORE, AFTER, INSTEAD OF)
TG_LEVEL (ROW, STATEMENT)
TG_OP (INSERT, UPDATE, DELETE)
TG_TABLE_NAME, TG_TABLE_SCHEMA

-- ejemplo con reglas de validaci�n


CREATE TABLE trabajador (
id serial PRIMARY KEY,
nombre text,
sueldo integer,
fecha_modificacion timestamp,
modificado_por text
);

CREATE OR REPLACE FUNCTION validar_trabajador() RETURNS trigger AS $$


BEGIN
IF NEW.nombre IS NULL THEN
RAISE EXCEPTION 'el nombre es obligatorio';
END IF;
IF NEW.sueldo IS NULL THEN
RAISE EXCEPTION '% debe tener sueldo', NEW.nombre;
END IF;

IF NEW.sueldo < 0 THEN


RAISE EXCEPTION '% no puede tener sueldo negativo', NEW.nombre;
END IF;

NEW.fecha_modificacion := current_timestamp;
NEW.modificado_por := current_user;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER validar_trabajador BEFORE INSERT OR UPDATE ON trabajador


FOR EACH ROW EXECUTE PROCEDURE validar_trabajador();

-- ejemplo creando bit�cora de cambios


CREATE TABLE bitacora_trabajador(
operacion char(1) NOT NULL,
fecha timestamp NOT NULL,
usuario text NOT NULL,
id_trabajador integer NOT NULL,
nombre text NOT NULL,
sueldo integer
);
CREATE OR REPLACE FUNCTION auditar_cambio_trabajador() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO bitacora_trabajador SELECT 'D', now(), user, OLD.id,
OLD.nombre, OLD.sueldo;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO bitacora_trabajador SELECT 'U', now(), user, NEW.id,
NEW.nombre, NEW.sueldo;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO bitacora_trabajador SELECT 'I', now(), user, NEW.id,
NEW.nombre, NEW.sueldo;
RETURN NEW;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER auditar_cambio_trabajador


AFTER INSERT OR UPDATE OR DELETE ON trabajador
FOR EACH ROW EXECUTE PROCEDURE auditar_cambio_trabajador();

También podría gustarte