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
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 |