Re: Trigger und Funktion

From: "A(dot) Kretschmer" <andreas(dot)kretschmer(at)schollglas(dot)com>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Trigger und Funktion
Date: 2007-03-08 06:17:27
Message-ID: 20070308061727.GA5998@a-kretschmer.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

am Wed, dem 07.03.2007, um 23:05:24 +0100 mailte udono folgendes:
> Hallo Liste,
>
> hab mal wieder ein Problem, das meinen Horizont etwas überschreitet.
>
> In einer OS Buchhaltung mit Postgresanbindung würde ich gerne etwas
> mehr Verantwortung für die Datenintegrität auf die Datenbank übertragen.
>
> Ich habe eine Tabelle acc_trans, die alle im System gebuchten
> Beträge beinhaltet. Jeder Buchungssatz besteht aus verschiedenen
> Buchungen mit identischer id und verschiedenen Beträgen.
>
> Tabelle acc_trans:
>
> trans_id | amount | ...
> ----------+------------+----
> 13 | 100.00000 | ...
> 13 | -107.00000 | ...
> 13 | 7.00000 | ...
> 13 | 107.00000 | ...
> 13 | -107.00000 | ...
> 14 | 100.00000 | ...

Das gibt aber hier schon ein Problem...

>
> Die Buchungssätze werden mittels Transaktionen in die Tabelle
> acc_trans gebracht.
>
> 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.


> Wie aber weiss ich vor der Transaktion, das die Summe der
> Teilbuchungen 0 ergibt?

Ist das nicht auch eine Frage der buchhalterischen Logig? Das sind doch
sicherlich jeweils 2 oder mehr Buchungen auf verschiedenen Konten, wo
sichergestellt sein muß, daß entweder alle oder keine erfolgt. Erfolgen
alle Buchungen, so ist automatisch alles richtig, oder versteh ich da
was flasch?
Wenn dem so ist, so bietet doch die 'Schutzhülle' der Transaktion über
alle nötigen Buchungen doch die Sicherheit, die Du suchst.

> Mit bspw. SELECT sum(amount) WHERE trans_id = 13 kann ich ja noch
> nicht arbeiten, weil die Transaktion noch nicht commitet wurde und
> ja auch vorher geprüft werden soll.
> (Es stehen PL/pgSQL und PL/Perl zur Verfügung)
>
> Vielleicht hat jemand von euch einen Tip?!

Wenn Deine Applikation weiß, daß alle Buchungen zwar getätigt, aber noch
nicht COMMITed wurden, kann sie ja eine Funktion aufrufen, die das
durchrechnet. In der DB selbst sehe ich keine echte Chance zu erkennen,
ob alle Buchungen erfolgt sind und ein COMMIT unmittelbar bevorsteht.
Wie gesagt, ein ON COMMIT - Trigger wäre nett...

Andreas
--
Andreas Kretschmer
Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Jürgen E. Fischer 2007-03-08 06:46:05 Re: Trigger und Funktion
Previous Message udono 2007-03-07 22:05:24 Trigger und Funktion