Triggers PostgreSQL

Me pidieron hace unos días una solución a inserciones en Base de datos, de tal manera que algunos valores que cumplieran ciertas características, se vieran modificados justo antes de almacenarse. Concretamente se trata de hacer que determinados campos de cada tabla se insertaran automáticamente en mayúsculas, teniendo ya toda la lógica de acceso e inserciones en la BD creada.

La solución es bien sencilla. Todos pensamos en un trigger, pero … ¿en postgreSQL?. Sí no hay ningún problema.

Imaginemos que tenemos una tabla PERSONA que tiene entre otros los campos NOMBRE, APELLIDOS, FECHA DE NACIMIENTO y queremos simplemente cambiar el nombre y apellidos de la persona a mayúsculas antes de cada inserción. Pues lo único que tendriamos que crearnos es un TRIGGER que se ejecute antes de cada ÍNSERT o UPDATE y que ejecute una función que cambie a mayúsculas los campos requeridos, es decir:

CREATE OR REPLACE FUNCTION UPPER_PERSONA() RETURNS trigger AS '
BEGIN
NEW.nombre := upper(NEW.nombre);
NEW.apellidos := upper(NEW.apellidos);
RETURN new;
END
' LANGUAGE plpgsql;

CREATE TRIGGER persona BEFORE INSERT or UPDATE
ON persona FOR EACH ROW
EXECUTE PROCEDURE UPPER_PERSONA(nombre, apellido);

Comentarios

  1. Menuda tontera, por que no hiciste?:

    INSERT
    INTO
    PERSONA
    (
    NOMBRE
    , APELLIDOS
    , FECHA DE NACIMIENTO
    )
    VALUES
    (
    upper(‘juan’)
    , upper(‘sin triggers’)
    , ’12-12-2008′
    );

  2. Hola Oscar, has obviado la parte de “teniendo ya toda la lógica de acceso e inserciones en la BD creada”. Es decir, hablamos de una aplicación que YA existe y YA ha sido desarrollada, y ahora toca arreglar el problema desde el punto de vista de la base de datos, para lo que se selecciona un trigger.
    Es obvio que se puede hacer en SQL dentro del código, pero eso no era una opción en este caso. Para eso no se hace un post en ese blog 😉

  3. create or replace trigger otro_log
    before insert or update on ciudad
    for each row
    begin
    :new.campo candidato := upper(:new.campo candidato);
    end;

    esto te sirve para los proximos registros que agreges

Comments are closed.