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();
Buenos días.
ResponderEliminarGracias 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
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