From: | Lennin Caro <lennin(dot)caro(at)yahoo(dot)com> |
---|---|
To: | Virginia <mavir78(at)gmail(dot)com>, Carlos Joaniquet <cjtambur(at)yahoo(dot)es> |
Cc: | Jaime Casanova <jaime(at)2ndquadrant(dot)com>, Ayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: problema con trigger |
Date: | 2010-10-28 17:30:12 |
Message-ID: | 601912.72493.qm@web59501.mail.ac4.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
--- On Thu, 10/28/10, Carlos Joaniquet <cjtambur(at)yahoo(dot)es> wrote:
From: Carlos Joaniquet <cjtambur(at)yahoo(dot)es>
Subject: Re: [pgsql-es-ayuda] problema con trigger
To: "Virginia" <mavir78(at)gmail(dot)com>
Cc: "Jaime Casanova" <jaime(at)2ndquadrant(dot)com>, "Ayuda" <pgsql-es-ayuda(at)postgresql(dot)org>
Date: Thursday, October 28, 2010, 7:23 AM
Por qué razón no se deben utilizar los campos calculados? Es que en alguna de mis tablas existen varios :) que me recalculan gastos, base imponible, iva, etc de un registro factura cada vez que introduzco un apunte contable que hace referencia a esa factura. ¿Es un mal diseño?
Gracias
Carlos Joaniquet Tamburini
El 26/10/2010, a las 14:52, Virginia <mavir78(at)gmail(dot)com> escribió:
El 25 de octubre de 2010 23:09, Jaime Casanova <jaime(at)2ndquadrant(dot)com> escribió:
2010/10/25 Virginia <mavir78(at)gmail(dot)com>:
> Buenas noches, cómo están? quisiera saber si pueden ayudarme con una duda.
> Tengo una tabla con los campos id, campo1, campo2, campo3, total y un
> trigger q lo que debería hacer es que cada vez q inserto un registro en esa
> tabla me sume el campo1 + campo2 + campo3 y actualice ese resultado en el
> campo total.
> Ahora bien, hice el trigger q se dispara desde la misma tabla me crea un
> lazo infinito, cóm puedo resolver esto? o no debo hacer un n trigger q se
> dispare cuando hay un evento en la tabla X para realizar una acción en la
> misma tabla X?
>
apoyo la idea de la vista (los campos calculados no deberian existir a
menos que haya una buena razon).
sobre tu problema, no ejecutes otro insert ni un update, por eso se
dispara el trigger deberias tener un codigo algo asi:
create function fn_trg_calcula() returns trigger as $$
begin
new.total = new.campo1+new.campo2+new.campo3;
end;
$$ language plpgsql;
--
Jaime Casanova www.2ndQuadrant.com
Professional PostgreSQL: Soporte y capacitación de PostgreSQL
Les comento, el código del trigger es el siguiente:
CREATE OR REPLACE FUNCTION calcular_total() RETURNS trigger AS '
BEGIN
IF (tg_op = ''INSERT'') OR (tg_op = ''UPDATE'') THEN
UPDATE promedios SET total= NEW.campo1 + NEW.campo2 + NEW.campo3 WHERE id = codigo;
END IF;
RETURN NEW;
END
' LANGUAGE plpgsql;
CREATE TRIGGER calcular_total AFTER INSERT OR UPDATE ON promedios
EXECUTE PROCEDURE calcular_total();
Normalmente en las bases de datos transaccionales no se guardan los campos calculados, esta filosofia se usa en las base de datos tipo data warehouse.
From | Date | Subject | |
---|---|---|---|
Next Message | Cesar A | 2010-10-28 19:11:01 | Re: Slony: fatal error |
Previous Message | Miguel Angel Hernandez Moreno | 2010-10-28 16:19:58 | Re: Maquinas para pgpool |