--- On Thu, 10/28/10, Carlos Joaniquet <cjtam...@yahoo.es> wrote: From: Carlos Joaniquet <cjtam...@yahoo.es> Subject: Re: [pgsql-es-ayuda] problema con trigger To: "Virginia" <mavi...@gmail.com> Cc: "Jaime Casanova" <ja...@2ndquadrant.com>, "Ayuda" <pgsql-es-ayuda@postgresql.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 <mavi...@gmail.com> escribió: El 25 de octubre de 2010 23:09, Jaime Casanova <ja...@2ndquadrant.com> escribió: 2010/10/25 Virginia <mavi...@gmail.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.