| From: | Cyrus Downey <cdowney(at)pryermachine(dot)com> | 
|---|---|
| To: | Alvaro Herrera <alvherre(at)commandprompt(dot)com> | 
| Cc: | pgsql-bugs(at)postgresql(dot)org | 
| Subject: | Re: BUG #3587: EXECUTE and trigger problem [VASCL:A163D284A86] | 
| Date: | 2007-08-29 22:08:05 | 
| Message-ID: | 46D5EE45.6020004@pryermachine.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-bugs | 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Alvaro Herrera wrote:
<blockquote cite="mid:20070829215646(dot)GW7911(at)alvh(dot)no-ip(dot)org" type="cite">
  <pre wrap="">cyrus wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">I am having problems using the Old record as part of the dynamic command
passed to the Execute statement in a trigger.  
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This is not a bug (please don't use the bug report form for support
requests).
Anyway, you may want to check the "tablelog" project in
<a class="moz-txt-link-freetext" href="http://pgfoundry.org/">http://pgfoundry.org/</a> for code that works for this purpose (or something
similar anyway).
  </pre>
</blockquote>
This was not a support request.  I have already solved the problem, but
it much more code than my original method (which does not work). 
According to the documentation I should be able to use the OLD record
in the dynamic command passed to the Execute statement.   <br>
<br>
I have attacked my DDL for you to review.<br>
<br>
<pre wrap="">The error received was:
ERROR:  OLD used in query that is not in a rule
CONTEXT:  SQL statement "INSERT INTO public.test_hist  SELECT  OLD.* from
OLD;"
PL/pgSQL function "hist_insert_tr" line 8 at execute statement
Below is the DDL I used to replicate the problem.
create table public.test(itest integer);
create table public.test_hist(      itest integer,
                             "dmodified" TIMESTAMP WITHOUT TIME ZONE DEFAULT
now() NOT NULL
                             );
CREATE OR REPLACE FUNCTION public.hist_insert_tr () RETURNS trigger AS
$body$
declare
       lcDynamicSQL varchar := '';
BEGIN
       --does not work
       --lcDynamicSQL := 'INSERT INTO public.' || TG_ARGV[0] || '_hist 
SELECT  OLD.*;';
       --does not work
       lcDynamicSQL := 'INSERT INTO public.' || TG_ARGV[0] || '_hist  SELECT
 OLD.* from OLD;';
       EXECUTE lcDynamicSQL;
       RETURN NULL;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE TRIGGER test_after_tr AFTER UPDATE 
ON public.test FOR EACH ROW 
EXECUTE PROCEDURE public.hist_insert_tr(test);
insert into test (itest) VALUES(1);
update test set itest = 2;
drop table public.test cascade;
drop table public.test_hist;
DROP FUNCTION public.hist_insert_tr();
Bug reference:      3587
Logged by:          cyrus
Email address:      <a class="moz-txt-link-abbreviated"
 href="mailto:cdowney(at)pryermachine(dot)com">cdowney(at)pryermachine(dot)com</a>
PostgreSQL version: 8.1.9
Operating system:   i686-redhat-linux-gnu
Description:        EXECUTE and trigger problem
 
</pre>
<br>
</body>
</html>
| Attachment | Content-Type | Size | 
|---|---|---|
| unknown_filename | text/html | 2.7 KB | 
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tom Lane | 2007-08-29 22:30:33 | Re: BUG #3586: Time zone problem in SQL query | 
| Previous Message | Alvaro Herrera | 2007-08-29 21:56:46 | Re: BUG #3587: EXECUTE and trigger problem |