Thread: trigger on table
I am trying to create a trigger on a table that simply sets the last_updated field when any updates are made to that table. I have tried the following: - CREATE FUNCTION set_item_last_updated () RETURNS OPAQUE AS ' BEGIN UPDATE item SET last_updated = now(); RETURN OLD; END;' LANGUAGE 'plpgsql'; CREATE TRIGGER item_last_updated AFTER UPDATE ON item FOR EACH ROW EXECUTE PROCEDURE set_item_last_updated(); When I try to execute this it hangs and postmaster eventually runs out of memory. Is there a way to do it just using sql not plpsql? Why is it hanging? Thank in advance. Graham
TryCREATE FUNCTION set_item_last_updated () RETURNS OPAQUE AS 'BEGINNEW.last_updated = now();RETURN NEW;END;'LANGUAGE 'plpgsql'; CREATE TRIGGER item_last_updated BEFORE UPDATE ON itemFOR EACH ROW EXECUTE PROCEDURE set_item_last_updated(); Make sure its BEFORE... Hope this helps http://www.pgexplorer.com GUI Tool for Postgres ----- Original Message ----- From: "Graham Vickrage" <graham@digitalplanit.com> To: "Postgres SQL" <pgsql-sql@postgresql.org> Sent: Thursday, February 14, 2002 2:17 PM Subject: [SQL] trigger on table > I am trying to create a trigger on a table that simply sets the last_updated > field when any updates are made to that table. > > I have tried the following: - > > CREATE FUNCTION set_item_last_updated () RETURNS OPAQUE AS ' > BEGIN > UPDATE item SET last_updated = now(); > RETURN OLD; > END;' LANGUAGE 'plpgsql'; > > CREATE TRIGGER item_last_updated AFTER UPDATE ON item > FOR EACH ROW EXECUTE PROCEDURE set_item_last_updated(); > > When I try to execute this it hangs and postmaster eventually runs out of > memory. > > Is there a way to do it just using sql not plpsql? > Why is it hanging? > > Thank in advance. > > Graham > > > > ---------------------------(end of broadcast)--------------------------- > TIP 3: if posting/reading through Usenet, please send an appropriate > subscribe-nomail command to majordomo@postgresql.org so that your > message can get through to the mailing list cleanly >
On Thu, Feb 14, 2002 at 12:17:02PM -0000, Graham Vickrage wrote: > I am trying to create a trigger on a table that simply sets the last_updated > field when any updates are made to that table. > > I have tried the following: - > > CREATE FUNCTION set_item_last_updated () RETURNS OPAQUE AS ' > BEGIN > UPDATE item SET last_updated = now(); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > RETURN OLD; > END;' LANGUAGE 'plpgsql'; > > CREATE TRIGGER item_last_updated AFTER UPDATE ON item ^^^^^^^ > FOR EACH ROW EXECUTE PROCEDURE set_item_last_updated(); > > When I try to execute this it hangs and postmaster eventually runs out of > memory. You create trigger on update and inside this trigger you do update again. It's cycle... > Is there a way to do it just using sql not plpsql? It works with PL/SQL, try: CREATE FUNCTION set_item_last_updated () RETURNS OPAQUE AS ' BEGIN NEW.last_updated := ''now''; RETURN NEW; END; ' LANGUAGE 'plpgsql'; CREATE TRIGGER item_last_updated BEFORE UPDATE ON itemFOR EACH ROW EXECUTE PROCEDURE set_item_last_updated (); Karel -- Karel Zak <zakkr@zf.jcu.cz>http://home.zf.jcu.cz/~zakkr/C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz
> > I have tried the following: - > > > > CREATE FUNCTION set_item_last_updated () RETURNS OPAQUE AS ' > > BEGIN > > UPDATE item SET last_updated = now(); > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > RETURN OLD; > > END;' LANGUAGE 'plpgsql'; Even better I guess, if you are running 7.1 or greater, use CURRENT_TIMESTAMP instead of now()? Chris
TryCREATE FUNCTION set_item_last_updated () RETURNS OPAQUE AS 'BEGINNEW.last_updated = now();RETURN NEW;END;'LANGUAGE 'plpgsql'; CREATE TRIGGER item_last_updated BEFORE UPDATE ON itemFOR EACH ROW EXECUTE PROCEDURE set_item_last_updated(); Make sure its BEFORE... Hope this helps http://www.pgexplorer.com GUI Tool for Postgres ----- Original Message ----- From: "Graham Vickrage" <graham@digitalplanit.com> To: "Postgres SQL" <pgsql-sql@postgresql.org> Sent: Thursday, February 14, 2002 2:17 PM Subject: [SQL] trigger on table > I am trying to create a trigger on a table that simply sets the last_updated > field when any updates are made to that table. > > I have tried the following: - > > CREATE FUNCTION set_item_last_updated () RETURNS OPAQUE AS ' > BEGIN > UPDATE item SET last_updated = now(); > RETURN OLD; > END;' LANGUAGE 'plpgsql'; > > CREATE TRIGGER item_last_updated AFTER UPDATE ON item > FOR EACH ROW EXECUTE PROCEDURE set_item_last_updated(); > > When I try to execute this it hangs and postmaster eventually runs out of > memory. > > Is there a way to do it just using sql not plpsql? > Why is it hanging? > > Thank in advance. > > Graham > > > > ---------------------------(end of broadcast)--------------------------- > TIP 3: if posting/reading through Usenet, please send an appropriate > subscribe-nomail command to majordomo@postgresql.org so that your > message can get through to the mailing list cleanly >