CREATE TRIGGER log_create_edit_product AFTER INSERT OR UPDATE OF title, price, unit, content, additions, hint, cover, description -- ONLY Certain fields ON public.product FOR EACH ROW WHEN (OLD.balance IS DISTINCT FROM NEW.balance) -- Condition! Optional -- OR: -- WHEN (OLD.* IS DISTINCT FROM NEW.*) -- WHEN (OLD.price > 100) -- WHEN (NEW.title = 'hello' AND NEW.price < 20::money) EXECUTE PROCEDURE public.log_create_edit_product(); CREATE FUNCTION public.log_create_edit_product() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN INSERT INTO product_history (action, aid, pid, title, price, unit, content, additions, rpids, tids, hint, cover, description) VALUES (if_else(TG_OP = 'INSERT', ':create'::action, ':edit'::action), COALESCE(NEW.editor_aid, NEW.creator_aid), NEW.id, NEW.title, NEW.price, NEW.unit, NEW.content, NEW.additions, NEW.rpids, NEW.tids, NEW.hint, NEW.cover, NEW.description); IF (TG_OP = 'INSERT') THEN INSERT INTO product_stat (pid, count_edit, title) values (new.pid, 1, new.title); ELSE UPDATE product_stat SET count_edit = count_edit + 1, last_update = present(), title = new.title WHERE pid = new.id; END IF; RETURN NEW; END;