That&#39;s interesting.&nbsp; I didn&#39;t get into an infinite loop, but the column wasn&#39;t updated either.<br><br>After changing it to BEFORE instead of AFTER, it worked, including on insert.&nbsp; And I didn&#39;t need to change opaque to trigger.&nbsp; Thanks for everyone&#39;s help.
<br><br><div><span class="gmail_quote">On 8/14/07, <b class="gmail_sendername">Kevin C. Smith</b> &lt;<a href="mailto:kevin@linuxsmith.com">kevin@linuxsmith.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On Tue, 2007-08-14 at 19:51 -0500, Kevin C. Smith wrote:<br>&gt; On Tue, 2007-08-14 at 18:22 -0500, Tim Wilson wrote:<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; On 8/14/07, Kevin C. Smith &lt;<a href="mailto:kevin@linuxsmith.com">
kevin@linuxsmith.com</a>&gt; wrote:<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; CREATE FUNCTION set_last_update() RETURNS opaque AS &#39;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; BEGIN<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; NEW.last_updated:=now
();<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; RETURN NEW;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; END;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; &#39; LANGUAGE &#39;plpgsql&#39;;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; CREATE TRIGGER set_last_update AFTER INSERT OR UPDATE ON
<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; people FOR EACH<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; ROW<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; EXECUTE PROCEDURE set_last_update();<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Okay I see maybe two issues (disclaimer I don&#39;t know what the
<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hell I&#39;m<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; talking<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; about).<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wouldn&#39;t a trigger AFTER insert or update become in infinite<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop, and maybe
<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; postgresql therefore ignores it? Just a guess.<br>&gt; &gt;<br>&gt; &gt; I thought trigger updates were different, but I&nbsp;&nbsp;guess it&#39;s possible.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I also think that were you have &#39;opaque&#39; you need &#39;trigger&#39;.
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; The &#39;trigger&#39; type caused the parser to complain.&nbsp;&nbsp;However, I&#39;ll try<br>&gt; &gt; it again when I can.&nbsp;&nbsp;It&#39;s possible the other things I did caused<br>&gt; &gt; &#39;trigger&#39; to be valid.&nbsp;&nbsp;But my guess is &#39;opaque&#39; works in 
7.1, but<br>&gt; &gt; &#39;trigger&#39; was added later.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I tested this and it worked:<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE OR REPLACE FUNCTION set_last_update()
<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURNS &quot;trigger&quot; AS<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NEW.last_updated = now();<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETURN NEW;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LANGUAGE &#39;plpgsql&#39; VOLATILE;
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE TRIGGER set_last_update<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEFORE INSERT OR UPDATE<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON test_table<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOR EACH ROW<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXECUTE PROCEDURE set_last_update();
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; I chose AFTER because I didn&#39;t want the timestamp to be affected if<br>&gt; &gt; for some reason the update failed.&nbsp;&nbsp;I also thought if it happened<br>&gt; &gt; before the insert, what would it be updating, since the record didn&#39;t
<br>&gt; &gt; exist yet.<br>&gt;<br>&gt; I wondered about INSERT also, but seems to work fine. Give it a try.<br>&gt; Not sure how it&#39;s actually being handled, but it works.<br>&gt;<br>&gt; AFTER update looks like a loop to me, since the trigger fires
<br>&gt; on insert or update of a row and itself updates a row in the same<br>&gt; table it watches for updates.<br>&gt;<br>&gt; Yeah, I forgot to mention that I&#39;m using version 8.2.4, so it may<br>&gt; be slightly different for your situation.
<br>&gt;<br>&gt; Thanks for the exercise!<br>&gt; I&#39;d been meaning to try out triggers in Postgresql,<br>&gt; after my trying some in MySQL.<br><br>P.S.<br>Searched for &quot;postgresql after update trigger loop&quot; on google and found
<br>this:<br><br><a href="http://blog.revsys.com/2006/08/automatically_u.html">http://blog.revsys.com/2006/08/automatically_u.html</a><br><br>Wish he would have reference something authoritative on that the<br>loop question.
<br><br><br><br>--<br>Religion is regarded by the common people as true, by the wise as false,<br>and by the rulers as useful. --- Lucius Annaeus Seneca<br><br>_______________________________________________<br>Cialug mailing list
<br><a href="mailto:Cialug@cialug.org">Cialug@cialug.org</a><br><a href="http://cialug.org/mailman/listinfo/cialug">http://cialug.org/mailman/listinfo/cialug</a><br></blockquote></div><br><br clear="all"><br>-- <br>Tim