Conceptos básicos de Triggers
9 ejemplos para empezar con los triggers de PostgreSQL: 6 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
9 ejemplos para empezar con los triggers de PostgreSQL: 6 básicos y 3 intermedios.
Tabla con INSERT/UPDATE que puedas modificar en desarrollo.
# Desarrollo local con Docker (PostgreSQL 18)
docker run -d --name pg18 -e POSTGRES_PASSWORD=dev -p 5432:5432 postgres:18
psql postgres://postgres:dev@localhost:5432/postgresSe ejecuta por cada fila insertada.
CREATE OR REPLACE FUNCTION app.log_insert() RETURNS trigger
LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'insertado %', NEW.id;
RETURN NEW;
END;
$$;
CREATE TRIGGER tr_log_insert AFTER INSERT ON app.accounts
FOR EACH ROW EXECUTE FUNCTION app.log_insert();Puede modificar NEW antes de escribir.
CREATE OR REPLACE FUNCTION app.touch_updated() RETURNS trigger
LANGUAGE plpgsql AS $$
BEGIN
NEW.updated_at := now();
RETURN NEW;
END;
$$;updated_atSe ejecuta una vez por sentencia SQL.
CREATE TRIGGER tr_stmt AFTER UPDATE ON app.accounts
FOR EACH STATEMENT EXECUTE FUNCTION app.log_insert();Eliminar cuando la lógica se mueve a la aplicación.
DROP TRIGGER IF EXISTS tr_log_insert ON app.accounts;Elección entre BEFORE y AFTER.
-- BEFORE: validar/modificar NEW
-- AFTER: auditar/efectos secundarios que referencian la fila finalEjecución condicional del trigger.
CREATE TRIGGER tr_status AFTER UPDATE OF status ON app.orders
FOR EACH ROW WHEN (OLD.status IS DISTINCT FROM NEW.status)
EXECUTE FUNCTION app.log_insert();Por defecto, orden alfabético por nombre.
CREATE TRIGGER a_first BEFORE INSERT ON app.accounts FOR EACH ROW EXECUTE FUNCTION app.touch_updated();
CREATE TRIGGER b_second BEFORE INSERT ON app.accounts FOR EACH ROW EXECUTE FUNCTION app.log_insert();Comprobación de restricciones diferida.
-- CONSTRAINT TRIGGER ... DEFERRABLE INITIALLY DEFERREDsession_replication_role o ALTER TABLE DISABLE.
ALTER TABLE app.accounts DISABLE TRIGGER tr_log_insert;
-- carga masiva
ALTER TABLE app.accounts ENABLE TRIGGER tr_log_insert;Versiones de la pila: Esta página se escribió para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.
Revisado por Chris St. John·Última actualización: 16 jul 2026