drop table base cascade; drop table log cascade; create table base (a int, b int); create view v1 as select a+1 as a1, b+2 as b2 from base; insert into base values (1,10),(11,13); create table log(ao int, an int, bo int, bn int); CREATE OR REPLACE FUNCTION vtrigger() RETURNS trigger LANGUAGE plpgsql AS $function$ begin raise notice '% % % %', TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL; raise NOTICE 'OLD: %, NEW: %', OLD, NEW; UPDATE base SET a = NEW.a1-1, b = NEW.b2-2 WHERE a = OLD.a1-1 AND b = OLD.b2-2; if NOT FOUND then RETURN NULL; end if; RETURN NEW; end; $function$; CREATE TRIGGER instead_of_update_trig INSTEAD OF UPDATE ON v1 FOR EACH ROW EXECUTE PROCEDURE vtrigger(); create rule logit as on update to v1 do also insert into log values(old.a1, new.a1, old.b2, new.b2); update v1 set a1 = a1-44;