Re: Trigger und Funktion

From: Andreas Seltenreich <andreas+pg(at)gate450(dot)dyndns(dot)org>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Trigger und Funktion
Date: 2007-03-08 12:20:24
Message-ID: 87hcswsz93.fsf@gate450.dyndns.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

A. Kretschmer writes:

> am Wed, dem 07.03.2007, um 23:05:24 +0100 mailte udono folgendes:
>> Es soll die Regel gelten, dass nur Buchungssätze in die Tabelle
>> acc_trans dürfen (UPDATE, INSERT), deren Summe der Einzelbeträge
>> (amount) aller Teilbuchungen (trans_id) 0 ergibt.
>
>
> IMHO wäre hier ein ON COMMIT TRIGGER sinnvoll. Haben wir leider nicht.

Hm, wenn man das "It is not intended for general use" in der Doku zu
"create constraint trigger" überliest, kann man damit scheinbar den
gewünschten Effekt erzielen:

--8<---------------cut here---------------start------------->8---
create table acc_trans(trans_id int, amount numeric);

create function check_balance() returns trigger as $$
begin

if tg_op = 'DELETE' or tg_op = 'UPDATE' then
if (select sum(amount) from acc_trans
where trans_id = old.trans_id)
<> 0 then
raise exception 'invalid balance';
end if;
end if;

if tg_op = 'INSERT' or tg_op = 'UPDATE' then
if (select sum(amount) from acc_trans
where trans_id = new.trans_id)
<> 0 then
raise exception 'invalid balance';
end if;
end if;

return new;
end
$$ language 'plpgsql';

create constraint trigger check_balance
after update or insert or delete
on acc_trans initially deferred
for each row execute procedure check_balance();
--8<---------------cut here---------------end--------------->8---

Gruß
Andreas

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Jürgen E. Fischer 2007-03-08 12:24:42 Re: Trigger und Funktion
Previous Message Andreas Kretschmer 2007-03-08 12:13:22 Re: Trigger und Funktion