lunes, 2 de julio de 2012

Ejemplo de trigger en postgresql


He aquí el último trigger de la guia número 4 de ejercicios sobre funciones y triggers

Un trigger en postgresql consta de una función, que es llamada desde el trigger propiamente dicho. Podemos llamar a la misma función desde mas de un trigger.

create or replace function puntoC()
returns trigger as $$
begin
if (old.x::integer%2= 0) then
update multiplos_2 set funcion_1 = round((3 * old.x) - 4, 2),
funcion_2 = round((3 * (old.x ^3)) - 5/2, 2),
funcion_3 = round((old.x / 3) * (-1) + 12, 2)
where multiplos_2.x = old.x
;
end if;
if (old.x%3= 0) then
update multiplos_3 set funcion_1 = round((3 * old.x) - 4, 2),
funcion_2 = round((3 * (old.x ^3)) - 5/2, 2),
funcion_3 = round((old.x / 3) * (-1) + 12, 2)
where multiplos_3.x = old.x
;
end if;
if (old.x%7= 0) then
update multiplos_7 set funcion_1 = round((3 * old.x) - 4, 2),
funcion_2 = round((3 * (old.x ^3)) - 5/2, 2),
funcion_3 = round((old.x / 3) * (-1) + 12, 2)
where multiplos_7.x = old.x
;
end if;
return old;
end;
$$
language plpgsql;

create trigger tg_puntoC
before delete
on funciones
for each row execute procedure puntoC();

2 comentarios:

  1. Buenos días.
    Gracias por el aporte muy valioso.

    Tengo una consulta:
    Un trigger que debe 'dispararse' después de la actualización de una columna en una tabla.
    El caso es que dentro de la función ligada al trigger, hay unas condiciones de comparación entre el nuevo valor de la columna y el valor de otra columna.

    Ej:

    CREATE OR REPLACE FUNCTION ActualizarEstado()
    RETURNS TRIGGER AS
    $ActualizarEstado$

    DECLARE

    BEGIN

    if NEW.es_activo = 'Y' then

    --Si el nuevo valor de la columna es_activo es 'Y', actualizar la columna fue_activo con 'Y' donde el id del estudiante sea igual al id del mismo en la variable NEW

    update estudiante
    set fue_activo = NEW.es_activo
    where estudiante_id = NEW.estudiante_id;

    RETURN NEW;

    else

    if (NEW.es_activo = 'N' and estudiante.fue_activo='Y') then

    --Si el nuevo valor de la columna es_activo es 'N' y fue_activo='Y' actualizar la columna fecha_cambio_estado con now() para guardar la fecha de cambio

    update adempiere.c_payment
    set fecha_cambio_estado = now()
    where estudiante_id = NEW.estudiante_id;
    --
    RETURN NEW;

    end if;
    end if;

    END;
    $ActualizarEstado$ LANGUAGE plpgsql;

    CREATE TRIGGER ActualizarEstado after UPDATE
    ON estudiante FOR EACH row
    EXECUTE PROCEDURE ActualizarEstado();

    Se genera el mensaje 'La columna fue_activo no existe'

    Saludos,
    Omar

    ResponderEliminar
    Respuestas
    1. Buenas tardes Omar, checkeaste que el nombre de la columna "fue_activo" este escrito correctamente?? Francamente no es mucho lo que puedo ayudar sin hechar un vistazo a la tabla en la db. Lo que puedo aconsejarte es que si tienes la posibilidad de resolver el problema mediante varias consultas lo hagas de esa forma, opino que los triggers son útiles pero deben dejarse como última opción, ya que tienden a ser olvidados, y después de un tiempo pasan cosas raras en la base de datos que ni uno mismo se acuerda bien.. Suerte con eso

      Eliminar