From: | "Mourad EL HADJ MIMOUNE" <mimoune(at)ensma(dot)fr> |
---|---|
To: | "Stephan Szabo" <sszabo(at)megazone23(dot)bigpanda(dot)com>, "Medi Montaseri" <medi(at)cybershell(dot)com> |
Cc: | <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Need help with a trigger |
Date: | 2002-02-26 16:04:16 |
Message-ID: | 001c01c1bedf$6e0a7c90$71a337c1@ensma.fr |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi,
I have a question in the same way. When I write OLD.oid in a trigger
procedure the trigger prompts "There are not Oid attribute for Old" Is this
a bug?
Mourad.
----- Original Message -----
From: "Stephan Szabo" <sszabo(at)megazone23(dot)bigpanda(dot)com>
To: "Medi Montaseri" <medi(at)cybershell(dot)com>
Cc: <pgsql-general(at)postgresql(dot)org>
Sent: Tuesday, February 05, 2002 7:49 AM
Subject: Re: [GENERAL] Need help with a trigger
> On Mon, 4 Feb 2002, Medi Montaseri wrote:
>
> > HI,
> >
> > Can someone help me with a trigger.....
> >
> > Given table invoices with ID, and Total (and bunch of other stuff) and
> > given
> > table Transactions with ID, InvoiceID, UnitCost, and Units where an
> > Invoice
> > consist of one or many Transactions. I want to write a trigger that if
> > UnitCost or
> > Units change, then visit all relevant Transactions and compute the new
> > Invoices.Total
> >
> > So I figured I need
> >
> > create function ComputeInvoiceTotal()
> > returns OPAQUE as '
> > begin
> > ....here is where I don't know what to write...
> > end;'
> > language 'plpgsql';
>
> maybe something like:
> if (TG_OP = ''UPDATE'') then
> update invoices
> set total=total+NEW.UnitCost*NEW.Units-OLD.UnitCost*OLD.Units
> where id=NEW.id;
> return NEW;
> elsif (TG_OP = ''DELETE'') then
> update invoices
> set total=total-OLD.UnitCost*OLD.Units
> return OLD;
> else
> update invoices
> set total=total+NEW.UnitCost*NEW.Units
> where id=NEW.id;
> return NEW;
> endif
>
> which doesn't actually recalculate from scratch, or you could do something
> similar with a set total=<subselect> that does recalculate for the id.
>
> > create trigger transactions_trig after update on transactions
> > for each row execute procedure ComputeInvoiceTotal
>
> And do it on updates and inserts and deletes probably.
>
> > I am a bit confused about parameter passing. Trigger Functions are
> > supposed to
> > take no arguments. that means somehow the body of the function will have
> > access
> > to the data. That would be NEW, and OLD special vars (I hope).
>
> Yep, and any arguments given on the create trigger line are passed in via
> TG_NARGS and TG_ARGV.
>
> > And I'm also confused about "for each row". What does it mean/do. I hope
> > its not
> > going to visit every row of a given table. Because the initial
> > update/insert has
> > identified which row(s).
>
> For Each Row means for each row affected by the action, so if the update
> changes two rows the function will be called twice, once for each affected
> row (with OLD and NEW set appropriately). This means if you do the full
> recalculation it might recalculate more than once for a particular invoice
> if two transactions were changed for it.
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
> (send "unregister YourEmailAddressHere" to majordomo(at)postgresql(dot)org)
From | Date | Subject | |
---|---|---|---|
Next Message | Eugene Chiu | 2002-02-26 16:15:04 | configure --with-pam |
Previous Message | Art Nicewick | 2002-02-26 15:42:58 | ora2pg fails on LONG object access in Catalog |